2017-09-27 5 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]} 

しかし、プロトタイプは、このように上書きされたときならば、我々はまだ確認できますこれが可能であるどのように

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

:オブジェクトがPersonコンストラクタによって作成されましたか?どのようにinstanceofpersonが見つかりましたPerson()constructorプロトタイプのフィールドがPersonを含まない場合、

+0

申し訳ありません、Jonasを修正しました。まだ学んでいる... – Sahand

+0

心配しない;)誤植... –

答えて

0

原因instance instanceof constructorオペレータdoesntの試験instance.prototype.constructorむしろconstructor.prototypeそのプロトタイプチェーン のオブジェクトがコンストラクタのプロトタイプの性質を持っているかどうかをinstance.__proto__

Reference

1

instanceof演算子をテストしました。

はこの考えてみましょう:

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 instanceof Person === false今、インスタンスの作成後にPerson.prototypeを変更する場合:

function Person(){} 
 

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

 
var person = new Person(); 
 

 
Person.prototype = {}; 
 

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

関連する問題