我正在使用Prototype.js(来自www.prototypejs.org)库来创建由子类扩展的类。我在这些类的实例中使用数组时遇到了麻烦。我举了一个例子来说明这一点:
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);
这里的问题是,第一个和第二个警报都会指示他们各自的对象在其items数组中有1个项目,即使我只向对象a添加了一个项目。原始数据类型正常工作(如正确显示的id属性所示)但数组不起作用。如果我将items数组和add方法移动到超类也没关系,我已经尝试过了。
有没有办法让这个工作?这是Prototype中的一个错误,还是这个JavaScript的本质? : - )
答案 0 :(得分:1)
传递给Class.create的对象文字的成员被添加到SubClass的原型中,因此所有对象都将共享items-array。您可以通过将items-definition移动到构造函数来修复这种情况:
var SubClass = Class.create(SuperClass, {
add: function(arg) {
this.items[this.items.length] = arg;
},
initialize: function($super, id) {
$super(id);
this.items = [];
}
});
答案 1 :(得分:0)
我不是Prototype用户但是...... JavaScript是一种原型语言。这意味着它使用原型继承。换句话说,对象从对象继承,或者对象从其他对象继承状态和行为。在您的情况下,对象a
和b
都将继承自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