为什么即使原型被覆盖,`obj instanceof ConstructorFunc`仍然返回true?

时间:2017-09-27 06:15:47

标签: javascript

我已经了解到,在函数原型中,指向函数本身的指针包含在名为constructor的字段中。

function Person(){
}
alert(Person.prototype.constructor); // function Person(){}

如果我用对象文字覆盖函数原型,构造函数字段自然会丢失:

function Person(){
}
Person.prototype = {
    name:"Sahand",
    age:24
}
alert(Person.prototype.constructor); // function Object(){[native code]}

但是,当以这种方式覆盖原型时,我们仍然可以检查对象是否由Person构造函数创建:

var person = new Person()
alert(person instanceof Person); // true

这怎么可能?当原型的instanceof字段不再包含person时,Person()如何constructor找出Person创建的内容?

2 个答案:

答案 0 :(得分:1)

  

instanceof运算符测试其原型链中是否有对象   具有构造函数的prototype属性。

考虑一下:



function Person(){}

Person.prototype = {
    name:"Sahand",
    age:24
}

var person = new Person();

console.log('instanceof', person instanceof Person);
console.log('Is "person __proto__ === Person.prototype":', 
    person.__proto__ === Person.prototype);




但如果您在创建实例后更改Person.prototype,那么现在person instanceof Person === false



function Person(){}

Person.prototype = {
    name:"Sahand",
    age:24
}

var person = new Person();

Person.prototype = {};

console.log('insanceof: ', person instanceof Person);




答案 1 :(得分:0)

导致instance instanceof constructor运算符未在instance.prototype.constructor

中测试constructor.prototype而非instance.__proto__

Reference