我正在寻找一种相对简单但有效的机制来实现干净的外观:
- 公共、私有和受保护成员(具有实际的公共/私有/受保护访问权限,但仍可扩展)
- 继承(单个或多个)
- 构造函数重载(最好不必计算 args 并使用一组复杂的嵌套条件检查类型)
我正在寻找一种相对简单但有效的机制来实现干净的外观:
好吧……在写这篇文章之前给自己泡了杯咖啡。唯一我不能帮助你的是超载。但没关系,我们开始吧:
// 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>;
.
=> 为方便起见,创建一个简单的别名:
var public = this;
private
成员在构造函数中可见,但在实例中不可见。他们仍然需要可访问public
方法。
=>var private = {};
你可以创建简单的变量,例如var fibo="nacci";
,我觉得private.fibo="nacci";
更具可读性。使用关键字创建的任何变量var
都不能从构造函数的外部范围访问。
static
即使尚未创建类的实例,成员也要准备好。在 JavaScript 中执行此操作的常用方法是为构造函数本身分配一个值或函数。在此处查看 SO 问题
=> 同样,为了可读性:
var static = Pseudo;
static private
成员:有时,您可能希望拥有在构造函数之外不可见的静态成员。
=> 使用词法范围来存储它们。var static_private = {};
有关类模式的进一步阅读: