我在尋找一個相對簡單而有效的機制來實施清潔尋找:有誰知道一個健壯的JavaScript僞類?
- 公共,私有和保護成員(實際公共/私營/保護訪問,但仍然可擴展)
- 繼承(單或多個)
- 構造函數重載(不喜歡都數不過來指定參數和檢查類型的一組複雜的嵌套條件的)
我在尋找一個相對簡單而有效的機制來實施清潔尋找:有誰知道一個健壯的JavaScript僞類?
好吧...自己做一杯咖啡,寫這篇之前。唯一我無法幫助你的是超載。不過沒關係,在這裏我們去:
// Class pattern with
// - dynamic prototypes
// - public, private, static, static private members
// Keeps functions named the way you want it to.
// Working example:
var YourClass = (function(){
var Pseudo = function(){
var args = arguments;
// constuct the instance in here:
var YourClass = function(){
var public = this,
private = {};
public.foo = args[0] ? args[0] : "bar";
public.staticPrivateInt = ++static_private.someInt;
private.fibo = "nacci";
// fibo is private - return it's value
// with a getter to make it "protected"
public.getFibo = function(){
return private.fibo;
}
public.setFibo = function(value){
if(typeof value === "string"){
// handle optional events here
return private.fibo = value;
}else{
return false;
}
}
};
var static = Pseudo,
static_private = {};
// statics:
static_private.someInt = 100;
static.increaseSomeInt = function(){
++static_private.someInt;
}
// extend on creation of an instance:
YourClass.prototype = args[0] || new Object(); // or anything else, just an example
return new YourClass;
};
return Pseudo;
}());
用法:
var myInstance = new YourClass({
someCfg: true
});
console.log(myInstance.someCfg === true); // will log true
多虧JavaScript的詞法作用域和閉包一個,的確可以模擬類被設計在如C等語言的方式++, Java等。
使用該模式時請記住以下幾點:
static.private
,因爲它們不再是私有的(因此變量爲static_private
)。它是如何工作
基本上,你想要的是:
public
成員與<object>.<member>
訪問。在Javascript中,通常使用this.<member> = <assignment>;
。
=>對於convenienve,創建一個簡單的別名: var public = this;
private
成員能夠在構造函數中可見的,但不是在該實例。仍然需要訪問public
方法。
=>var private = {};
您可以創建簡單變量,例如var fibo="nacci";
,但我發現private.fibo="nacci";
更具可讀性。任何使用var
關鍵字創建的變量都不能從構造函數的外部範圍訪問。
static
即使尚未創建該類的實例,也要準備好成員。在JavaScript中這樣做的常用方法是給構造函數本身分配一個值或函數。看到如此質疑here
=>此外,爲便於閱讀: var static = Pseudo;
static private
成員:Occasionaly,你可能希望有靜態成員是你的構造外面看不見。
=>使用詞法作用域來存儲它們。 var static_private = {};
有關類圖案進一步閱讀:
@Xymostech - 你可以在閉包中使用局部變量實現等價於「private」的功能。 – nnnnnn 2013-02-17 02:59:23
@nnnnnn公平點。儘管如此,「受保護」仍然沒有出現。 – Xymostech 2013-02-17 03:00:53
而javascript確實具有簡單的繼承性,在一天中可以調用重載,以及使變量無法訪問的方式。這聽起來像OP一樣在尋找某種類,就像你在許多C語言中使用的那樣,它會在javascript中修復所有這些,而afaik不存在。 – adeneo 2013-02-17 03:15:32