我使用了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的类型语言来看,我非常确定这不是事情本应该起作用的方式。如果有人有更优雅的方式来做上述事情,我全都耳朵。
一如既往,非常有责任。
答案 0 :(得分:2)
修复如下(添加构造函数):
...略...
var Cat = Animal.extend({
prey: [],
constructor: function(){
this.prey = [];
},
getPrey: function(){return this.prey}
});
...略...
解决方案是由一位名叫Miguel Bollar的同事给我的。他是一位绅士和学者。
答案 1 :(得分:0)
这本身并不是一个错误。它不理解语义。 Cat.prey
是一个类级别属性,其引用类型为Object
,Array
在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']
因此,您已经有希望学习,引用类型应该在构造函数中初始化。