問題は、あなたが行うときということです:
return { ...
あなたは以前に作成したnew
キーワード(あなたがする2つのプロパティを割り当てる1)そのオブジェクトとは別の、新しいオブジェクトを作成しています。 jeff instanceof Person
が偽であり、jeff.constructor === Object
であることがわかります。
この例を参照してください:あなたがオブジェクトに名前と年齢プロパティを割り当てることによって、それを修正することができ
function Person(name, age) {
this.name = name;
this.age = age;
return {
theObjectThatNewCreated: this
}
}
var jeff = new Person('jeff', 28);
console.log(JSON.stringify(jeff));
// {"theObjectThatNewCreated":{"name":"jeff","age":28}}
console.log(jeff.constructor);
// Object
console.log(jeff.theObjectThatNewCreated.constructor);
// Person
あなたはthis
に戻る代わりに:
function Person(name, age) {
return {
name: name,
age: age,
ageUp: function ageUp() {
this.age++;
},
printInfo: function printInfo() {
console.log(this.name + " is " + this.age + " years old");
},
changeName: function changeName(newName) {
this.name = newName;
}
}
}
var jeff = new Person('jeff', 28);
jeff.printInfo();
しかし、その後、人は本当にないですコンストラクタですが、それはオブジェクトファクトリに過ぎず、new
で呼び出すポイントはありません。それが返すオブジェクトはPersonのインスタンスではなく、普通の古いオブジェクトです。より良い方法があります。
2つのデザインパターンを組み合わせてはいけませんか?これについて最善の方法は何でしょうか?
明らかなモジュールパターンと通常のJavaScriptコンストラクタを組み合わせていると思います。
の代わりにあなただけの代わりに、新しいオブジェクトのPersonオブジェクトのプロパティとしてこれらの機能を割り当てるために、すべての方法を通じてthis
を使用することができ、新しいオブジェクトを返す:
function Person(name, age) {
this.name = name;
this.age = age;
this.ageUp = function ageUp() {
this.age++;
};
this.printInfo = function printInfo() {
console.log(this.name + " is " + this.age + " years old");
};
this.changeName = function changeName(newName) {
this.name = newName;
};
}
var jeff = new Person('jeff', 28);
jeff.printInfo();
をしかし、これらの機能はないので、コンストラクタからクローズされた変数を使用すると、コンストラクタのプロトタイプに実際に追加する必要があります。
function Person(name, age) {
this.name = name;
this.age = age;
}
Person.prototype.ageUp = function ageUp() {
this.age++;
};
Person.prototype.printInfo = function printInfo() {
console.log(this.name + " is " + this.age + " years old");
};
Person.prototype.changeName = function changeName(newName) {
this.name = newName;
};
var jeff = new Person('jeff', 28);
jeff.printInfo();
良い答え、 "これらの関数はコンストラクタの変数を閉じて使用しません"という文を明確にしてください。 それを理解できませんでした... – chenop
@chenop私は、コンストラクタ内で 'var'で宣言された変数、またはコンストラクタのパラメータを意味します。 – Paulpro