我正在寻找一种相对简单但有效的机制来实现干净的外观:
答案 0 :(得分:1)
好吧......在写这篇文章之前给自己做了一杯咖啡。我唯一无法帮助你的是超载。但没关系,我们走了:
// 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>;
。
=&GT;为方便起见,创建一个简单的别名:
var public = this;
private
成员在构造函数中可见,但在实例中不可见。仍需要public
方法访问它们。
=&GT; var private = {};
你可以创建简单的变量,例如var fibo="nacci";
,我发现private.fibo="nacci";
更具可读性。使用var
关键字创建的任何变量都无法从构造函数的外部作用域访问。
static
成员也要准备好。在JavaScript中执行此操作的常用方法是为构造函数本身分配值或函数。请参阅问题here
=&GT;同样,为了便于阅读:
var static = Pseudo;
static private
成员:偶尔,您可能希望拥有在构造函数外部不可见的静态成员。
=&GT;使用词法范围来存储它们。 var static_private = {};
有关课程模式的进一步阅读: