只是爲了好玩:這也可能是,以防止忘記new
關鍵字的方式:
function User(first,last,id){
User.Instance = User.Instance|| function(firstname,lastname,id){
this.firstname = firstname || 'nofirstname';
this.lastname = lastname || 'nolastname';
this.id = id || 0;
if (!User.Instance.prototype.nameUpper){
User.Instance.prototype.nameUpper = function(){
return this.name.toUpperCase();
};
User.Instance.prototype.resetId = function(){
this.id = 0; return this;
};
User.Instance.prototype.toString = function(){
return [this.id,': ',
this.firstname[0].toUpperCase(),
this.firstname.slice(1),
' ',
this.lastname[0].toUpperCase(),
this.lastname.slice(1)].join('');
};
}
}
return new User.Instance(first,last,id);
}
//usage
var pete = User('pete','johanssen',1),
jean = User('jean','harlowe',2),
mary = new User('mary','wsnovsky',3);
console.log(pete); //=> 1: Pete Johanssen'
console.log(mary); //=> 3: Mary Wsnovsky'
關於你的問題:我會考慮「良好實踐」相當規範/評判。每天吃奶牛眼是不錯的做法嗎?如果我要回答這個問題,我會說不,但我肯定不是所有人都會同意的。使用您演示的模式來規避被遺忘的new
關鍵字本身並不好或不好。這取決於您設定的標準:您是否想強制執行某種嚴格規定,或者您是否想要防範自己或同事的sl?行爲?該模式的性能會降低嗎?請問chukj的答案在所有情況下都適用,如果不是,那對你來說足夠了嗎?
我喜歡的東西之一和討厭javascript是它的靈活性。 JSLint的,據我從道格拉斯克羅克福德的講座瞭解,旨在迫使你一個統一的編程風格 - 用他自己的話說:使用JSLint的
將傷害你
但另一方面,jslint提供了很多可能性來使用諸如'容忍錯誤定義','容忍非大寫構造函數'等選項來減輕這種力量。換句話說,即使使用jslint,'好習慣'也不是明確界定。
有時JavaScript社區的行爲就像'javascript教派的教會'。其中我們發現非常嚴格的信徒,對他們來說法律是法律,對它的每一個失常都是一個基本罪行(對他們來說可能是「使用嚴格的」是專門發明的)。其他人則遵循更加務實的道路。有經常上教堂的人和從不出現的人。分裂現象出現。有些人計劃離開這個教堂,並找到一個新的教堂,例如其中classes
被允許並被認爲是好的和神聖的。
現在可以清楚了:我認爲沒有'好習慣'這樣的東西。或者用更僞的宗教術語來表述它:好的做法在旁觀者眼中是。
我認爲如果你正在開發一個公共圖書館,人們可能會錯誤地調用'User()'而不是'new User()''''''' – 2012-03-10 08:59:11