使用Prototype的Class.create定义私有/受保护的属性和方法

时间:2009-05-21 23:03:30

标签: javascript oop prototypejs private protection

在Javascript here on the site中定义私有和受保护的属性和方法有一个很好的通用方法。但是,当前版本的Prototype(1.6.0)没有通过其Class.create()语法定义它们的内置方法。

我很好奇当开发人员想要在使用Prototype时定义私有和受保护的属性和方法时,最佳实践是什么。有没有比通用方法更好的方法?

3 个答案:

答案 0 :(得分:2)

在Prototype的灯塔中有一个讨论here,它解释了为什么你无法通过Prototype的Class.create获得这种效果。

答案 1 :(得分:1)

你可以做的是在你的构造函数函数(initialize)中使用局部变量作为原型,然后创建一个闭包,将这个变量访问/暴露给你的公共方法。

这是一个代码示例:

// 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理论。

http://www.crockford.com/javascript/private.html

答案 2 :(得分:0)

关键是将公共方法添加为闭包,如下例所示:

 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