JavaScript原型继承是JavaScript中实现对象继承的一种机制。每个JavaScript对象都有一个内部属性[[Prototype]]
(在ES6及以后版本中可以通过__proto__
属性访问),指向它的原型对象。当试图访问一个对象的属性时,如果该对象本身没有这个属性,JavaScript会沿着原型链向上查找,直到找到该属性或到达原型链的顶端(null
)。
"instanceof"是JavaScript中的一个操作符,用于检测构造函数的prototype
属性是否出现在某个实例对象的原型链上。换句话说,它用来判断一个对象是否是某个构造函数的实例。
call()
或apply()
方法将父类构造函数的上下文绑定到子类实例上,从而实现属性继承。prototype
设置为父类的实例来实现继承。instanceof
时会出现误判?原因:instanceof
操作符在判断时是基于原型链的,如果原型链被修改或者存在多个全局环境(如多个iframe),可能会导致误判。
解决方法:
function safeInstanceOf(obj, constructor) {
if (typeof constructor !== 'function') {
throw new TypeError('Right-hand side of instanceof is not callable');
}
let prototype = constructor.prototype;
let currentProto = Object.getPrototypeOf(obj);
while (currentProto) {
if (currentProto === prototype) {
return true;
}
currentProto = Object.getPrototypeOf(currentProto);
}
return false;
}
原因:在原型链上,如果子类和父类有同名的属性或方法,子类的属性会覆盖父类的属性。
解决方法:
function Parent() {
this.name = 'Parent';
}
Parent.prototype.sayHello = function() {
console.log('Hello from Parent');
};
function Child() {
this.name = 'Child';
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
Child.prototype.sayHello = function() {
console.log('Hello from Child');
};
const child = new Child();
console.log(child.name); // Child
child.sayHello(); // Hello from Child
领取专属 10元无门槛券
手把手带您无忧上云