我看了a talk by Douglas Crockford on the good parts in Javascript,我的眼睛 被打開。他說,有一點像「Javascript是唯一的語言,好的程序員相信他們可以有效地使用它,而不需要學習它。」然後我意識到,我是那個人。OO Javascript的構造模式:新古典vs原型
在那次演講中,他發表了一些對我來說非常驚人和有見地的發言。例如,JavaScript是這個星球上最重要的編程語言。或者它是這個星球上最流行的語言。而且,它以許多嚴肅的方式被打破。
他對我所做的最令人驚訝的表述是「新的危險」。他不再使用它了。他也沒有使用this
。
他爲Javascript中的構造函數提出了一個有趣的模式,它允許私有和公共成員變量,並且既不依賴於new
也不依賴於this
。它看起來像這樣:
// neo-classical constructor
var container = function(initialParam) {
var instance = {}; // empty object
// private members
var privateField_Value = 0;
var privateField_Name = "default";
var privateMethod_M1 = function (a,b,c) {
// arbitrary
};
// initialParam is optional
if (typeof initialParam !== "undefined") {
privateField_Name= initialParam;
}
// public members
instance.publicMethod = function(a, b, c) {
// because of closures,
// can call private methods or
// access private fields here.
};
instance.setValue = function(v) {
privateField_Value = v;
};
instance.toString = function(){
return "container(v='" + privateField_Value + "', n='" + privateField_Name + "')";
};
return instance;
}
// usage
var a = container("Wallaby");
WScript.echo(a.toString());
a.setValue(42);
WScript.echo(a.toString());
var b = container();
WScript.echo(b.toString());
編輯:代碼更新,切換到小寫類名。
此模式已從Crockford's earlier usage models發展而來。
問題:你使用這種類型的構造函數嗎?你覺得這可以理解嗎?你有更好的嗎?
天才......不像構造函數,更像工廠! – Zoidberg 2009-11-27 17:42:20
確保你防止使用像var c = new Container();這可能涉及檢查這個值。 – 2009-11-27 18:13:14
我同意@Kevin Hakanson,道格拉斯克羅克福德實際上建議在這種方法中使用小寫字母的初始值,以及大寫字母的初始值用於與新的方法一起使用的構造函數方法。 – 2009-11-27 18:21:35