JavaScript 可见性 : Private and Privileged methods:

标签 javascript methods private member

我试图理解并理解何时在 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/

相关文章:

Javascript 从下拉列表中自动选择

java - 如何从一种方法返回 ArrayList 和文件数组?

javascript - 是否有 Javascript 信息的中央存储库?

javascript 有条件返回意外结果

javascript - 无法使用 CasperJS 提交表单 - 换句话说无法登录

php - 为什么 PHP 私有(private)变量适用于扩展类?

android - 在 Java 代码中将 EditText 设置为私有(private)字段会导致错误

ruby - 从另一个私有(private)方法中使用 self.xxx() 调用私有(private)方法 xxx,导致错误 "private method ` xxx' called”

javascript - js Promise - 如果条件满足,如何结束 "then"执行,如果不满足则继续下一步

java - 为什么在 Java 中调用同一个类中的构造函数时会出现不明确的错误?