我想我在Dean Edward的Base.js课上发现了一个错误

时间:2012-10-11 16:46:42

标签: javascript inheritance

我使用了Dean Edward's 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的类型语言来看,我非常确定这不是事情本应该起作用的方式。如果有人有更优雅的方式来做上述事情,我全都耳朵。

一如既往,非常有责任。

2 个答案:

答案 0 :(得分:2)

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

...略...

var Cat = Animal.extend({

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

...略...

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

答案 1 :(得分:0)

这本身并不是一个错误。它不理解语义。 Cat.prey是一个类级别属性,其引用类型为ObjectArray在JavaScript中)。除非您(重新)在构造函数中定义它,否则所有实例都将共享完全相同的引用。它与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']

因此,您已经有希望学习,引用类型应该在构造函数中初始化。