JavaScriptオブジェクトのconstructor属性
10370 ワード
constructor属性は常に現在のオブジェクトを作成するコンストラクタを指します.
例えば、次の例:
しかし、コンストラクタがプロトタイプに出会うと、面白いことが起こります.
各関数にはデフォルトの属性プロトタイプがあることを知っていますが、このプロトタイプのcontructorはこの関数をデフォルトで指しています.
次の例に示します
以下の例を示します
Person.prototypeを上書きする場合、下記のコード操作を行うことと等価です.
例えば、次の例:
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