我试图理解并理解何时在 JavaScript 中使用私有(private)方法以及何时使用特权方法。根据这篇文章:Private Members in JavaScript ,对象的私有(private)成员可以通过私有(private)方法和特权方法访问和修改。在编写 getter 方法(针对私有(private)成员)时,您会使用私有(private)方法还是特权方法?为什么?对于访问器(修改私有(private)成员的方法),您会使用私有(private)方法还是特权方法?为什么?这种情况下使用的标准技术是什么?
最后,使用私有(private)方法与特权方法访问私有(private)变量有什么区别(除了不能从外部调用私有(private)方法这一事实)。
function ClassB(given)
{
var myVar = given;
function _get ()
{
return myVar;
};
this.get = function ()
{
myVar = myVar + 3;
return myVar;
};
}
最佳答案
当您设计对象时,您需要做出开始的决定。您是否关心将对象的内部结构暴露给外界?
如果您不在乎,那么您真的应该将所有方法添加到对象的原型(prototype)中,并将所有实例变量添加到构造函数中的 this
中。在某些情况下,这种方法可能并不理想。这就是特权方法的用武之地,以及使用闭包来模仿私有(private)方法。
当您创建一个特权方法时,它可以访问您所注意到的对象的私有(private)和公共(public)成员。在原型(prototype)上创建特权方法和公共(public)方法的最大区别在于,特权方法是在对象的每个实例中创建的,而原型(prototype)上的公共(public)方法只创建一次。如果您有许多特权方法并且正在创建大量对象实例,您会发现在内存使用方面这可能是不可取的。
我假设您希望对外界隐藏一些内部功能,因此您需要使用特权方法。对于所有的 getter/setter,您需要将它们定义为特权并将它们添加到 this
(否则,如果您打算将它们设为私有(private),则创建 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'
};
至于你的最后一个问题,关于使用私有(private)方法还是特权方法来修改一些私有(private)成员......正如你所说的,你无法从外部世界访问它,这意味着它会很漂亮除非您向私有(private) getter 方法添加其他功能,并通过特权方法将其暴露给外界,否则无用。如果您在对象的构造函数中做了很多繁重的工作,这可能是创建可重用的 getter/setter 方法的正当理由,但这实际上取决于您的用例。
如果这没有回答您的问题,或者如果您想对某事进行任何其他具体解释,请随时提出。
关于JavaScript 可见性 : Private and Privileged methods:,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24333180/