JavaScript可见性:私有和特权方法:

时间:2014-06-20 18:04:35

标签: javascript methods private member

我试图理解并理解何时使用私有以及何时在JavaScript中使用特权方法。根据这篇文章:Private Members in JavaScript,可以通过私有方法和特权方法访问和修改对象的私有成员。在编写getter方法(对于私有成员)时,您会使用私有方法还是特权方法?为什么?对于访问者(修改私有成员的方法),您会使用私有或特权方法吗?为什么?在这种情况下使用的标准技术是什么?

最后,使用私有和特权方法访问私有变量有什么不同(除了不能从外部调用私有方法的事实)。

function ClassB(given) 
{

    var myVar = given;

    function _get ()
    {
         return myVar;
    };

     this.get = function ()
     {
         myVar = myVar + 3;
         return myVar;
     };


   }

1 个答案:

答案 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方法的正当理由,但这实际上取决于你的用例。

如果这不能回答你的问题,或者你想要任何其他具体的解释,可以随意提问。