实例化后,“私人”成员(变量)是否可以添加到闭包中?Javascript:在关闭时,实例化后可以添加私有成员(var`s)吗?
我想我明白了这么多下面我闭幕(请纠正我,如果我错了!):
this.x
可用“公开”
:可通过this.y()var y
不可公开,但new Closure()
后,我可以添加一个新的 “公共” 这样的访问var c=new Closure(); c['z']=25; console.log(c.z); // z is a dynamically added public member
所以...有没有一种方法来动态添加一个私有成员(VAR)和 “新-ING” 关闭后其get/set函数?
var Closure=(function(){
function Closure(x){
// "public" member
this.x=x;
};
// "private" member backing variable
var _y=0;
// get/set private member
Closure.prototype.y=function(newValue){
if(newValue){
_y=newValue;
return(this);
}else{
return(_y);
}
};
// return
return(Closure);
})();
var c=new Closure(10,15);
// Can I add var _z and it's get/set function at this point?
是的,您可以。只需创建一个新的闭包,并在该对象上添加私有变量的getter/setter函数。然而,新的私有变量只会在新的封闭中。它不会在旧的关闭。无论如何,你的用例是什么? – 2014-10-18 15:13:52
@AaditMShah。感谢您的回应!那么如何在运行时动态地将'var z'添加到Closure中(请原谅我的“noobiness”)?我会将我的用例描述为“动态继承”。我想从一个基本的Closure开始,并根据需要动态添加成员(public和private)。 – JustAsking 2014-10-18 15:23:27
我会做类似'(function(c,z){cz = function(v){if(arguments.length){z = v; return c;} else return z;};}(c,null)) '。但是,你真的需要私有变量吗?考虑一下:你已经让程序员用getter和setter来设置'z'的值。那么为什么不把它公开呢?而且,继承和OOP不是99%用例的解决方案。你应该看一看代数数据类型:https://en.wikipedia.org/wiki/Algebraic_data_type – 2014-10-18 15:42:46