的問題是,當你這樣做:
return { ...
您正在創建一個新的對象,從對象分開的new
關鍵字先前創建(您分配了兩個屬性的一個)。您可能會注意到jeff instanceof Person
爲false,並且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的實例,它們是普通的舊對象。有一個更好的辦法。
我結合了兩種設計模式,我不應該這樣做嗎?什麼是最好的方式去做這件事?
我會說你正在將揭示模塊模式與普通的JavaScript構造函數相結合。
,而不是返回一個新的對象,你可以只使用this
一路過關斬將,分配這些功能作爲Person對象,而不是一個新的對象的屬性:
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