如何检查实例的构造函数

时间:2017-06-06 03:23:02

标签: javascript constructor instanceof

我使用'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;'。

为什么???

1 个答案:

答案 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运算符使用。

希望这有帮助。