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
如您所见, publicMethod
和privilegedMethod
都是公共的,它们都可以在外部访问,但privilegedMethod
可以访问其他数据。
上一篇: Public and Privileged methods in javascript: Why are they called that way?