Prototype.js和数组中的类继承

时间:2009-08-27 14:11:06

标签: javascript arrays class prototypejs

我正在使用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的本质? : - )

2 个答案:

答案 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是一种原型语言。这意味着它使用原型继承。换句话说,对象从对象继承,或者对象从其他对象继承状态和行为。在您的情况下,对象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