1

我用过Dean Edward 的 base.js。我已经用了很多年了,但是论坛已经死了,所以我想我会在这里发帖,看看是否有人知道发生了什么。以下显示了我的问题:

        var Animal = Base.extend({
            name: "",
            constructor: function(name){
                this.name = name
            },
            getName: function(){
                this.name
            }

        });

        var Cat = Animal.extend({

            prey: [],
            getPrey: function(){return this.prey}
        });

        var Tiger = Cat.extend({});
        var House = Cat.extend({});

        var cats = [];
        cats.push(new Tiger());
        cats.push(new House());

        cats[0].prey.push("dogs");
        cats[1].prey.push("mice");

        console.log(cats[0].getPrey());
        console.log(cats[1].getPrey());

基本上,它创建了一个三层层次结构(不确定是否需要最年长的父级),中间父级有一个数组。当两个单独的子实例向它们继承的数组中添加一些东西时,它会出现在两个子实例中。我认为上面的代码会在控制台中打印:

["dogs"]
["mice"]

相反,它打印:

["dogs", "mice"]
["dogs", "mice"]

我错过了什么吗?这可能是故意的,但从类型化语言 OO 的角度来看,我很确定这不是事情应该工作的方式。如果有人有更优雅的方式来完成上述操作,我会全神贯注。

一如既往,非常感谢。

4

2 回答 2

2

修复如下(添加构造函数):

……剪……

var Cat = Animal.extend({

    prey: [],
     constructor: function(){
         this.prey = [];
     },
     getPrey: function(){return this.prey}
});

……剪……

解决方案是由一位名叫 Miguel Bollar 的同事提供给我的。他是一位绅士,也是一位学者。

于 2012-10-12T14:31:46.327 回答
0

它本身不是一个错误。它不理解语义。Cat.prey是具有引用类型的类级别属性(在 JavaScript 中为 , )ObjectArray除非您在构造函数中(重新)定义它,否则所有实例都将共享完全相同的引用。它与 Python 中的以下内容相同。

class Cat:

  prey = []

  def getPrey(self):
    return self.prey

c1 = Cat()
c1.prey.append('foo')
c2 = Cat()
c2.prey.append('bar')

print c1.getPrey() # ['foo', 'bar']
print c2.getPrey() # ['foo', 'bar']

因此,正如您已经希望了解的那样,引用类型应该在构造函数中初始化

于 2014-10-17T10:23:35.807 回答