我認爲您需要更好地瞭解對象和原型如何在Javascript中工作。
考慮你有一個用例,你需要一個代表user
的對象,並存儲他們的first_name
。
不使用任何功能,你可以簡單地與你想要的屬性,可創建一個對象:
var person = {
first_name: 'joel'
};
這是一個標準的JavaScript對象 - 沒有什麼特別可言,也沒有新的關鍵字的使用來構建它。另一種語法來完成同樣的事情將是:
var person = new Object();
person.first_name = 'joel';
再次 - 這僅僅是一個標準的對象 - 沒有什麼特別的。
創建new
函數實例的主要原因是使用javascript的原型系統。這與其他語言的類相似。假設你想要一個人的所有實例都有一個名爲getName()
的方法。你可以確保你對每個人都有這種方法...
var person = {
first_name: 'joel',
getName: function() {
return this.first_name;
}
};
or ...
var person = new Object();
person.first_name = 'joel';
person.getName = function() {
return this.first_name;
};
然而,對於這樣的事情,在這裏你總是會希望爲每個用戶定義的這個方法更好的方法,是創建一個person
對象的新實例,並定義上的getName
方法人身函數的原型屬性:
function Person() {}
Person.prototype.getName = function() {
return this.first_name;
}
var user = new Person();
user.first_name = 'joel';
console.log(user.getName());
......或根據你的榜樣,你可以用一個參數來Person
構造函數來設置的第一個名字屬性:
function Person(first_name) {
this.first_name = first_name;
}
Person.prototype.getName = function() {
return this.first_name;
};
var user = new Person('joel');
console.log(user.getName());
請注意,使用此方法時,您始終會在創建Person
實例時使用new
關鍵字。當你考慮到followng這樣做的原因變得清晰:
function Person() {this.first_name = 'joel'; return 'test';}
console.log(window.first_name); // Undefined, as expected
console.log(Person()); // Shows "test";
console.log(window.first_name); // shows "joel".
console.log(new Person()); // Shows "{first_name: 'joel'}"
注意,以上4行,你可以看到,通過省略一個函數調用,希望你可以使用它的new
關鍵字,你意外地修改了window
對象上的屬性,而不是將其設置爲新的常規對象。
有效地 - 您可以考慮使用new
關鍵字來導致人員功能的返回值被廢除,取而代之的是您將返回人員對象的新實例。
另外請注意,你可以從你的函數中省略new
關鍵字如果this
等於減少window
對象的意外修改的風險,通過檢查window
並返回你的函數的一個新實例,而不是:
function Person() {
if (this === window) return new Person();
this.first_name = 'joel';
}
通過上述,您可以使用以下兩種方法的實例化對象person
,都將有同樣的效果:
var user1 = new Person();
var user2 = Person();
有關函數和原型對象如何JavaScript的工作,我建議您閱讀使用閉包,而不是對象http://www.w3schools.com/js/js_object_prototypes.asp
你有什麼樣的代碼是造成'new'操作失敗?可以/應該改變這個問題來詢問你的具體情況,以及爲什麼'new'失敗,而不是尋找實例化對象實例的替代方法? – 2015-03-02 05:13:48
@JoelCox - 我更新了我的問題。我同意我們需要'new'關鍵字,但是甚至省略我沒有看到任何區別。 – 3gwebtrain 2015-03-02 05:16:38
請注意,使用* new *調用時,函數**必須返回一個對象。在上面,你傳遞一個原始字符串,所以構造函數返回由* this *引用的新對象,而不是字符串。 – RobG 2015-03-02 05:35:29