讓我們來看看在正常類構造函數和原型
//-------------------
//---- Class signalr
//-------------------
//-- constructor
var signalr=function() {}
//--prototype
signalr.prototype.init=function (url)
{
this.url=url;
}
signalr.prototype.test=function() {alert ("test");}
//-------------------
//---- Class signalr -- END
//-------------------
所以產生這個類,我們必須寫出以下的新實例。
var con=new signalr(); //--- con would inherit two methods init and test
con.init ("yoururl");
讓我們看看克羅克福德
//-------------------
//---- Class signalr - Crockford
//-------------------
//-- signalr is here not the constructor, it's a normal function with a return value and setted prototype, the constructor becomes init which is defined in the signalr prototype
var signalr=function (url)
{
return new signalr.prototype.init (url);
}
//--prototype
//-----------
//-- constructor
signalr.prototype.init=function (url)
{
this.url=url;
}
signalr.prototype.test=function() {alert ("test");}
signalr.prototype.init.prototype=signalr.prototype //- with this line, the prototype of the init method which is the constructor of our instances is linked to the prototype signalR so all instances would inherit the properties and methods defined in the signalR prototype
//-------------------
//---- Class signalr -- END
//-------------------
所以產生這個類,我們可以很快寫出下面來達到同樣像上面的一個新實例。
var con=signalr ("yourURL"); //--- con inherits all the methods and properties of signalr.prototype with one line
似乎crockford懶惰地寫行,我在考慮實際的例子。但我認爲整個事情並不令人興奮
此模式啓用的唯一方法是您可以不帶'new'調用'signalR'。另請參閱https://stackoverflow.com/questions/15591434/which-form-of-initialization-is-better – Bergi
@Bergi我相信有一點超出了這個範圍:例如 - 他實例化init方法。所以init是ctor函數.....你確定這是唯一的東西嗎?如果你把它轉換成一個答案,這將是非常感激的(ps鏈接有點真實,但不是100%,因爲在這裏,正如我所說的,他正在處理init作爲ctor函數) –
是的,他使用'init '作爲構造函數,這是一個可怕的模式。 – Bergi