在Javascript中访问私有成员的公共方法
我希望能够在Javascript中创建一个对象,该对象具有可以访问该对象的私有成员的公共方法。然而,我听说每次创建对象时声明公共方法都会有开销,所以我更愿意避免这种开销。例如,这段代码可以满足我的要求:在Javascript中访问私有成员的公共方法,javascript,object,Javascript,Object,我希望能够在Javascript中创建一个对象,该对象具有可以访问该对象的私有成员的公共方法。然而,我听说每次创建对象时声明公共方法都会有开销,所以我更愿意避免这种开销。例如,这段代码可以满足我的要求: function createMyObject(parameter) { var that = {}; var privateVariable, privateMethod = function () { return 1; }; that.publi
function createMyObject(parameter) {
var that = {};
var privateVariable,
privateMethod = function () { return 1; };
that.publicVariable = 0;
that.publicMethod = function () {
privateVariable = privateMethod();
}
return that;
}
但每次有人调用CreateMObject时,它都必须创建函数来设置公共方法。如果我这样做:
function MyClass(parameter) {
var privateVariable,
privateMethod = function () { return 1; };
this.publicVariable = 0;
}
MyClass.prototype.publicMethod = function () {};
在这里,我可以避免每次构造对象时创建新函数来设置公共方法,但是这些公共方法不能访问对象的私有成员
是否有某种方法可以避免每次构造对象时必须为公共方法创建新函数的开销,但也可以让它们访问私有成员?不,不能
能够访问私有变量的公共方法称为特权方法
作者:道格拉斯·克罗克福德:
特权方法能够访问私有变量和
方法,并且公共方法和
外面。可以删除或替换特权方法,但
不可能改变它,也不可能强迫它放弃它的秘密
特权方法在构造函数中被分配此
然后,您不能使用原型声明特权方法。使用新的Javascript功能,您可以拥有真正的私有成员。基本上,您可以使用WeakMap隐藏您的成员 Firefox和Chromium中的“实验Javascript”标志都支持这一点
var MyClass = (function(){
var privmap = new WeakMap; // This holds our private members. Keep it secret.
function MyClass(){
var priv = {};
privmap.set(this, priv); // Add your private object for this instance.
this.notsec = "Anyone can access this!";
priv.secret = "Only code in this closure can see this!";
}
MyClass.prototype.secret = function MyClass_secret() {
var priv = privmap.get(this); // Get our private object.
return priv.secret; // Retrieve.
}
return MyClass;
})();
var o = new MyClass;
console.log(o.secret()); //-> Only code in this closure can see this!
通过在每个函数的开头添加一行,可以返回私有对象。我喜欢称之为priv
,这样公共成员就可以在this
上进行,在priv
上进行私有化,很好且一致
这有一个很好的优点,即每个方法只有一个实例,而不是为每个实例创建闭包。可以使用自调用函数隐藏“私有”函数,但不能创建不在实例之间共享的私有变量。我不知道这与如何创建不同。