JavaScriptオブジェクトのconstructor属性

10370 ワード

constructor属性は常に現在のオブジェクトを作成するコンストラクタを指します.
例えば、次の例:
 1 //     var foo = new Array(1, 56, 34, 12); 

 2 var arr = [1, 56, 34, 12];  3 console.log(arr.constructor === Array); // true 

 4 //     var foo = new Function(); 

 5 var Foo = function() { };  6 console.log(Foo.constructor === Function); // true 

 7 //           obj   

 8 var obj = new Foo();  9 console.log(obj.constructor === Foo); // true 

10  

11 //        ( 6,9 )   ,         

12 console.log(obj.constructor.constructor === Function); // true 
 
しかし、コンストラクタがプロトタイプに出会うと、面白いことが起こります.
各関数にはデフォルトの属性プロトタイプがあることを知っていますが、このプロトタイプのcontructorはこの関数をデフォルトで指しています.
次の例に示します
 1 function Person(name) {  2     this.name = name;  3 };  4 Person.prototype.getName = function() {  5     return this.name;  6 };  7 var p = new Person("TT");  8  

 9 console.log(p.constructor === Person);  // true 

10 console.log(Person.prototype.constructor === Person); // true 

11 //                 

12 console.log(p.constructor.prototype.constructor === Person); // true 
  関数のprototypeを再定義すると、constructor属性の挙動がおかしいです.
以下の例を示します
 1 function Person(name) {  2     this.name = name;  3 };  4 Person.prototype = {  5     getName: function() {  6         return this.name;  7  }  8 };  9 var p = new Person("TT"); 10 console.log(p.constructor === Person);  // false 

11 console.log(Person.prototype.constructor === Person); // false 

12 console.log(p.constructor.prototype.constructor === Person); // false 
  なぜですか
Person.prototypeを上書きする場合、下記のコード操作を行うことと等価です.
1 Person.prototype = new Object({  //Object   

2     getName: function() { 3         return this.name; 4  } 5 }); 
  construct属性は常に自分自身のコンストラクションを作成することを指しています.だから、このときPerson.prototype.com nstructor==Objectは次の通りです.
 1 function Person(name) {  2     this.name = name;  3 };  4 Person.prototype = {       //        

 5     getName: function() {  6         return this.name;  7  }  8 };  9 var p = new Person("TT"); 10 console.log(p.constructor === Object);  // true 

11 console.log(Person.prototype.constructor === Object); // true 

12 console.log(p.constructor.prototype.constructor === Object); // true 
  この問題をどう修正しますか?方法も簡単です.Person.prototype.com nstructorを上書きすればいいです.
 1 function Person(name) {  2     this.name = name;  3 };  4 Person.prototype = new Object({  5     getName: function() {  6         return this.name;  7  }  8 });  9 Person.prototype.constructor = Person;   //    Person

10 var p = new Person("TT"); 11 console.log(p.constructor === Person);  // true 

12 console.log(Person.prototype.constructor === Person); // true 

13 console.log(p.constructor.prototype.constructor === Person); // true