我试图理解并理解何时使用私有以及何时在JavaScript中使用特权方法。根据这篇文章:Private Members in JavaScript,可以通过私有方法和特权方法访问和修改对象的私有成员。在编写getter方法(对于私有成员)时,您会使用私有方法还是特权方法?为什么?对于访问者(修改私有成员的方法),您会使用私有或特权方法吗?为什么?在这种情况下使用的标准技术是什么?
最后,使用私有和特权方法访问私有变量有什么不同(除了不能从外部调用私有方法的事实)。
function ClassB(given)
{
var myVar = given;
function _get ()
{
return myVar;
};
this.get = function ()
{
myVar = myVar + 3;
return myVar;
};
}
答案 0 :(得分:4)
在设计对象时,您需要决定开始。你是否关心将物体的内部暴露给外界?
如果您不在乎,那么您应该将所有方法添加到对象的原型中,并将所有实例变量添加到构造函数中的this
。在某些情况下,这种方法可能并不理想。这是特权方法的用武之地,以及用于模仿私有方法的闭包的使用。
当您创建特权方法时,它可以访问该对象的私有和公共成员,如您所知。在原型上创建特权方法和公共方法之间的最大区别在于,特权方法是使用对象的每个实例创建的,而原型上的公共方法只创建一次。如果你有许多特权方法并且你正在创建很多对象的实例,你可以看到在内存使用方面这可能是不可取的。
我假设您希望隐藏一些来自外部世界的内部功能,因此您需要使用特权方法。对于您的所有getter / setter,您需要将它们定义为特权并将它们添加到this
(否则,如果您打算将其保密,则创建getter / setter没有多大意义):
function SomeClass() {
// Private member
var _privateMember = 1;
// Public variable
this.publicMember = 1;
// Privileged getter method
this.getPrivateMember = function() {
return _privateMember;
};
// Privileged setter method
this.setPrivateMember = function(newVal) {
_privateMember = newVal;
};
// Private method that has access to '_privateMember' and 'this'
var _privateMethod = function() {
// Modify private member
_privateMember = 2;
// Modify public member
this.publicMember = 1;
// Do some other fancy processing privately
};
this.doSomethingAwesome = function() {
// Do some stuff here...
// Call your private method maybe?
_privateMethod();
};
}
// Public methods on prototype do not have access to private methods in your constructor
SomeClass.prototype.publicMethod = function() {
// Cannot access `_privateMember`
this.publicMember = 2; // Does have access to 'this'
};
关于你的上一个问题,关于使用私人与特权方法修改一些私人成员......正如你所说,你将无法从外部世界访问它,这意味着除非您向私有getter方法添加其他功能,并通过特权方法将其暴露给外部世界,否则它将毫无用处。如果你在对象的构造函数中做了很多繁重的工作,这可能是创建可重用的getter / setter方法的正当理由,但这实际上取决于你的用例。
如果这不能回答你的问题,或者你想要任何其他具体的解释,可以随意提问。