2017-09-27 56 views
0

我已經瞭解到,在函數的原型中,指向函數本身的指針包含在名爲constructor的字段中。爲什麼`obj instanceof ConstructorFunc`仍然返回true,即使原型被覆蓋?

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了?

+0

對不起喬納斯,糾正。仍在學習...... – Sahand

+0

不用擔心;)錯別字發生... –

回答

0

導致instance instanceof constructor操作犯規測試instance.prototype.constructor而是instance.__proto__

Reference

1

instanceof運算測試中它的原型鏈 對象是否有一個構造函數的原型屬性constructor.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);

相關問題