2009-08-27 64 views
1

我使用Prototype.js(来自www.prototypejs.org)库创建子类扩展的类。尽管我在这些类的实例中使用数组时遇到了麻烦。我做了一个例子来说明这一点:Prototype.js和数组中的类继承

var SuperClass = Class.create({ 
    initialize: function(id) { 
     this.id = id; 
    } 
}); 

var SubClass = Class.create(SuperClass, { 
    items: [], 

    add: function(arg) { 
     this.items[this.items.length] = arg; 
    }, 

    initialize: function($super, id) { 
     $super(id); 
    } 
}); 

var a = new SubClass("a"); 
var b = new SubClass("b"); 

a.add("blah"); 
alert(a.id + ": " + a.items.length); 
alert(b.id + ": " + b.items.length); 

这里的问题是,第一和第二警报将指示各自的对象有1个项目在他们的项目数组,即使我只加一个项目反对原始数据类型正常工作(正如显示的id属性所示),但数组不起作用。如果我将items数组和add方法移动到超类,我也没有关系,我已经尝试过了。

有没有办法让这个工作?这是Prototype中的一个bug还是JavaScript本身的东西? :-)

回答

1

将传递给Class.create的对象字面量的成员添加到SubClass的原型中,因此所有对象都将共享items-array。您可以通过将项目定义移至您的构造函数来修补情况:

var SubClass = Class.create(SuperClass, { 

    add: function(arg) { 
     this.items[this.items.length] = arg; 
    }, 

    initialize: function($super, id) { 
     $super(id); 
     this.items = []; 
    } 
}); 
+0

哇,快速解答。而且也是正确的!非常感谢,非常感谢。 – Jerry 2009-08-27 14:20:25

0

我不是Prototype用户,但是... JavaScript是原型语言。这意味着它使用原型继承。换句话说,对象从对象继承,或者对象从其他对象继承状态和行为。在你的情况下,对象ab将从Class.create(SuperClass, {})中的文字表示中声明的对象继承,因此将在两者之间共享items,因为MyClass的每个实例都从该对象文字继承。

下面是一些例子:

var Foo = function (name) { 
    this.name = name; 
}; 

var Bar = function() {}; 
Bar.prototype = new Foo("John"); 

var a = new Bar; 
var b = new Bar; 

alert(a.name); // John 
alert(b.name); // John