我使用'new'关键字创建了新实例('instance1'和'instance2')。就像这样。
1.with'Child.prototype.constructor = Child'
function Parent() {
}
function Child() {
Parent.call(this);
}
Child.prototype = new Parent();
Child.prototype.constructor = Child;
var instance1 = new Child();
2.without'Child.prototype.constructor = Child'
function Parent() {
}
function Child() {
Parent.call(this);
}
Child.prototype = new Parent();
var instance2 = new Child();
我可以使用'instanceof'关键字检查实例的构造函数。
instance1 instanceof Child // true
instance1 instanceof Parent // true
这个结果是有道理的,因为我清楚地写了'Child.prototype.constructor = Child;'。所以instanceof关键字可以找到两个构造函数。 BUT
instance2 instanceof Child // true
instance2 instanceof Parent // true
。 但这个结果对我来说没有意义。我期待
instance2 instanceof Child // false
因为我没有写'Child.prototype.constructor = Child;'。
为什么???
答案 0 :(得分:0)
instanceof
对象存在于被测对象的Prototype链(Constructor.prototype
)中, __proto__
运算符将查找。
所以在你的例子中:
function Parent() {}
function Child() {
Parent.call(this);
}
Child.prototype = new Parent();
var instance2 = new Child();
由于instance2
是由Child()
构造函数构建的,__proto__
的{{1}}指向instance2
构造函数的原型对象,即Child()
。
当你测试:
Child.prototype
instance2 instanceof Child
运算符将查看instanceof
原型链中是否存在Child.prototype
对象,由于instance2
是从instance2
构造函数构造的,因此结果为true 。
换句话说:
Child()
以第二个案例为例:
instance2.__proto__ === Child.prototype
此处instance2 instanceof Parent
的原型链即(instance2
)具有__proto__
对象,它将评估为true。即。
Parent.prototype
最后注意事项:
instance2.__proto__.__proto__ === Parent.prototype
运算符与上述条件检查非常相似,可以测试对象是否是构造函数的实例。构造函数的instanceof
对象上出现的constructor
属性在测试时从不被prototype
运算符使用。
希望这有帮助。