有一个很好的通用方法可以在 Javascript 中定义私有和受保护的属性和方法,在网站上。但是,当前版本的 Prototype (1.6.0) 没有内置的方法来通过其Class.create()
语法定义它们。
我很好奇当开发人员想要在使用 Prototype 时定义私有和受保护的属性和方法时,最佳实践是什么。有没有比通用方法更好的方法?
有一个很好的通用方法可以在 Javascript 中定义私有和受保护的属性和方法,在网站上。但是,当前版本的 Prototype (1.6.0) 没有内置的方法来通过其Class.create()
语法定义它们。
我很好奇当开发人员想要在使用 Prototype 时定义私有和受保护的属性和方法时,最佳实践是什么。有没有比通用方法更好的方法?
Prototype的灯塔中有一个讨论,它解释了为什么你不能使用 Prototype 的 Class.create 获得这种效果。
您可以做的是在您的构造函数(初始化)中使用局部变量作为原型,然后创建一个闭包,该闭包将访问/公开此变量给您的公共方法。
这是一个代码示例:
// properties are directly passed to `create` method
var Person = Class.create({
initialize: function(name) {
// Protected variables
var _myProtectedMember = 'just a test';
this.getProtectedMember = function() {
return _myProtectedMember;
}
this.name = name;
},
say: function(message) {
return this.name + ': ' + message + this.getProtectedMember();
}
});
这是Douglas Crockford关于这个主题的理论。
关键是将公共方法添加为闭包,如下例所示:
Bird = Class.create (Abstract,(function () {
var string = "...and I have wings"; //private instance member
var secret = function () {
return string;
} //private instance method
return {
initialize: function (name) {
this.name = name;
}, //constructor method
say: function (message) {
return this.name + " says: " + message + secret();
} //public method
}
})());
Owl = Class.create (Bird, {
say: function ($super, message) {
return $super(message) + "...tweet";
} //public method
})
var bird = new Bird("Robin"); //instantiate
console.log(bird.say("tweet")); //public method call
var owl = new Owl("Barnie"); //instantiate
console.log(owl.say("hoot")); //public method call inherit & add