【问题标题】:JavaScript Visibility: Private and Privileged methods:JavaScript 可见性:私有和特权方法:
【发布时间】:2014-08-11 13:27:06
【问题描述】:

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

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

function ClassB(given) 
{

    var myVar = given;

    function _get ()
    {
         return myVar;
    };

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


   }

【问题讨论】:

  • 使用适合你的任何东西,在 js 中伪造经典继承没有硬性规定。
  • 我更担心安全问题。目前我正在使用一个私有函数来访问/修改一个私有成员,以及一个调用私有函数的特权函数。如果我只使用特权方法,会不会影响安全性?
  • @FranXh 不要假设任何客户端都是“安全的”
  • 实际上显示的方法是“受保护的”,就像 doug 所说的那样,公共的,就像大多数人所说的那样。没有私有方法,只有私有内部函数,它们本质上不会发布到实例。安全性在于控制对 myVar 的更改,这可能发生在公共、“私有”或“受保护”函数中,安全性完全没有差异,因为只有内部函数才能看到 myVar,而不管可见性如何。
  • @dandavis “这可能发生在公众身上”。你这是什么意思?可以从公共方法访问私有变量吗?

标签: javascript methods private member


【解决方案1】:

当您设计您的对象时,您需要做出决定。您是否关心将对象的内部结构暴露给外界?

如果您不在乎,那么您应该将所有方法添加到对象的原型中,并将所有实例变量添加到构造函数中的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 方法的正当理由,但这实际上取决于您的用例。

如果这不能回答您的问题,或者如果您想对某事进行任何其他具体解释,请随时提出。

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 1970-01-01
    • 2011-08-09
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 2021-02-14
    相关资源
    最近更新 更多