コンストラクター プロパティは常に、現在のオブジェクトを作成したコンストラクターを指します。たとえば、次の例:
コード をコピーします。 コードは次のとおりです:
/ / 同等の場合 var foo = new Array(1, 56, 34, 12);
var arr = [1, 56, 34, 12];
console.log(arr.constructor === Array); // true
// var foo = new Function();
var Foo = function() { };
console.log(Foo.constructor === Function); 🎜 >// コンストラクターによって obj オブジェクトをインスタンス化します
var obj = new Foo();
console.log(obj.constructor === Foo); // 上記の 2 つを置き換えますコードをまとめると、次の結論が得られます。
console.log(obj.constructor.constructor === Function); // true
しかし、コンストラクターがプロトタイプに遭遇すると、興味深いことが起こります。起こる それはただ起こっただけです。
各関数にはデフォルトの属性プロトタイプがあり、このプロトタイプのコンストラクターはデフォルトでこの関数を指すことがわかっています。次の例に示すように:
関数 人(名前) {
this.name = 名前;
person.prototype.getName = function() {
this.name を返す
}; new Person("ZhangSan ");
console.log(p.constructor === 人); // true
console.log(person.prototype.constructor === 人); // true >// 上記になります。 2 行のコードを結合すると、次の結果が得られます。
console.log(p.constructor.prototype.constructor === Person) // true
関数のプロトタイプを再定義すると (注: 上記の例との違いは、変更ではなく上書きです)、次の例に示すように、コンストラクター属性の動作が少し奇妙になります:
コードをコピーします
人物.prototype = {
getName: function () {
この名前を返します;
}; "ZhangSan");
console.log(p.constructor === 人); // false
console.log(Person.prototype.constructor === 人); // false
コンソール。 log(p.constructor.prototype.constructor === 人); // false
なぜですか?
Person.prototype を上書きすると、次のコード操作と同等であることがわかります:
コードをコピー
コードは次のとおりです:
constructor 属性は常にそれ自体を作成するコンストラクターを指します。そのため、この時点では Person.prototype.constructor === オブジェクト、つまり
コードをコピーします
コードは次のとおりです。 >person.prototype = {
getName: function() {
この問題を解決するにはどうすればよいですか?方法も非常に簡単で、 Person.prototype.constructor を再度上書きするだけです:
コードをコピー
コードは次のとおりです。
function person(name) {
this.name = name;
}
person.prototype = new Object({
getName: function() {
return this.name ;
}