27

如果我理解正确,根据 Douglas Crockford http://javascript.crockford.com/private.html,“特权”方法类似于我们所知的“公共”方法。和“公共”方法有点不同。

我是这样理解的:

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

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

    var C = function(){
       /* blah blah */
    }
    C.prototype.publicMethod = function(){
        /* blah blah */
    };
    var cObj = new C();
    

我发现这些“特权”和“公共”的定义非常令人困惑。我认为“特权”方法实际上是一种公共方法,正如我们从面向对象编程中所知道的那样。而且我认为“公共”方法应该被命名为其他方法。如果你仔细想想,它是一种奇怪的函数,它是对象的成员,但它不能访问任何其他私有变量,这意味着它对封装没有贡献。它几乎就像对象的独立辅助方法。

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

4

5 回答 5

10

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

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

另一方面,附加到对象原型的公共方法有一个更重要的事情——它们被评估一次,并且在给定对象的所有实例中都可以看到。

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

我不知道它是否清楚,但这里主要是 JavaScript 是基于原型的语言,并且在语言中引入了原型链以使继承成为可能。

于 2012-09-15T17:40:11.537 回答
3

弗拉德,我同意你的看法:我也很困惑!看这里(来自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

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

于 2013-02-05T17:39:37.070 回答
1

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

在 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

如您所见,两者publicMethod都是privilegedMethod公共,因为它们都可以从外部访问,但privilegedMethod可以访问其他数据。

于 2015-08-05T11:27:39.657 回答
0

两种方法的主要区别在于特权方法可以继承,这意味着子类可以直接访问它们,但公共方法不能用于子类,当然在经典继承方法中。

希望这很有用。

于 2014-12-31T17:35:38.183 回答
0
  1. 使用“this”关键字创建特权方法,使用构造函数的原型属性创建公共方法。

  2. 特权方法可以访问私有变量和方法。公共方法可以调用特权方法,但不能调用私有方法。

  3. 对象内部和外部都可用的特权和公共方法。

于 2019-12-22T17:12:07.413 回答