JavaScript中的公共和特权方法:为什么他们这样叫?

如果我理解正确,根据道格拉斯克罗克福德http://javascript.crockford.com/private.html,“特权”方法类似于我们所知的“公共”方法。 和“公共”方法有些不同。

以下是我的理解:

  • “特权”方法可以访问私有变量,因为它是在定义其余私有变量时在闭包内定义的。

    var C = function(){
      var private;
      this.privilegedMethod = function(){
           /* blah blah */
      };
    }
    var cObj = new C();
    
  • “公共”方法是通过原型添加到对象本身之外的对象。

    var C = function(){
       /* blah blah */
    }
    C.prototype.publicMethod = function(){
        /* blah blah */
    };
    var cObj = new C();
    
  • 我发现这些“特权”和“公众”的定义非常混乱。 我认为“特权”方法只不过是我们从面向对象编程中所了解的公共方法。 我认为“公共”方法应该被命名为别的东西。 如果你仔细想想,它是一种奇怪的函数类型,它是对象的成员,但它不能访问任何其他私有变量,这意味着它不会对封装做出贡献。 它几乎就像一个独立的帮助对象的方法。

    所以我想知道,为什么道格拉斯克罗克福德想出了这些令人困惑的术语? 为什么JavaScript社区采用了这些术语? 或者如果我对某件事有错,请纠正我。


    由于在JavaScript中没有像public / private / protected这样的范围修饰符,为了接近OOP世界,Douglas Crockford使用这样的名称,而不是混淆来自任何人,可以说Java

    特权方法可以看到函数内部定义的变量(这里是一个重要的注释 - 在JavaScript中,唯一的范围是函数范围,没有块范围),所以它们是“特权”的。 是的,他们可以从对象实例中调用,但重要的是,他们看到所有的东西,用var声明(真正的私人东西)

    另一方面,连接到对象原型的公共方法还有一个更重要的事情 - 它们被评估一次,并看到给定对象的所有实例。

    如果在原型方法中使用this关键字,它将指向Object的当前实例,但您将只能看到在this定义的内容。

    我不知道它是否清楚,但最重要的是JavaScript是基于原型的语言,原型链是以语言引入的,以便使继承成为可能。


    弗拉德,我同意你的看法:我也很困惑! 看这里(来自http://javascript.crockford.com/private.html):

    function Container(param) {
        // methode privee
        function dec() {
        console.log('private method is looking for private member secret : ' + secret);
            if (secret > 0) {
                secret -= 1;
                return true;
            } else {
                return false;
            }
        }
        // membres privées
        var secret = 3;
        var that = this;
        // méthode privilégiée
        this.service = function () {
        console.log('priviligied method is looking for private member secret : ' + secret);
            return dec() ? that.member : null;
        };
        // membres publiques
        this.member = param;
    
    }
    var myContainer = new Container('abc');
    
    Container.prototype.stamp = function (string) {
        console.log('public method is looking for private member secret : ' + this.secret);
        return this.member + string;
    }
    
    console.log(myContainer.stamp('def'));
    //for (i=0;i<4;i++)
    console.log(myContainer.service());
    

    特权对公众

    这个jsfiddle示例将显示:

    public method is looking for private member secret : undefined
    abcdef
    priviligied method is looking for private member secret : 3
    private method is looking for private member secret : 3
    abc
    

    所以,答案是:公共方法<=>特权方法不是吗?


    在传统的面向对象语言中,一个类的所有成员都可以访问一个类的所有其他成员。

    Javascript中不是这种情况。 公共方法可以访问私有数据,该类的其他成员(即构造函数)都不知道这些数据。 同样,该课程的其他成员可能拥有该方法无法看到的数据。

    考虑如下:

    function TheirTrait() {
      var privateData = "foo";
      this.privilegedMethod = function() {
        return privateData;
      }
    }
    
    function MyClass() {
      var privateData = undefined;
      this.publicMethod = function() {
        return privateData;
      }
      TheirTrait.apply(this, arguments);
    }
    
    var myObject = new MyClass();
    myObject.privilegedMethod() // returns "foo"
    myObject.publicMethod() // returns undefined
    

    如您所见, publicMethodprivilegedMethod都是公共的,它们都可以在外部访问,但privilegedMethod可以访问其他数据。

    链接地址: http://www.djcxy.com/p/51869.html

    上一篇: Public and Privileged methods in javascript: Why are they called that way?

    下一篇: Where to put model data and behaviour?