每个实例共享相同的
this.settings
对象可变数据结构必须在
构造函数
,不在原型上:
Test.prototype = {
initialize: function(options) {
this.settings = {
a: {},
b: {},
c: options.c;
};
}
};
请注意,这似乎是“传统方式”(根据文档),较新的方式是:
var Test = Class.create({
initialize: function(options) {
this.settings = {
a: {},
b: {},
c: options.c;
};
}
});
这个问题实际上在
PrototypeJS documentation
:
编程语言中的继承类型
通常,我们区分基于类的继承和原型继承,后者特定于JavaScript。
当然,原型继承是该语言的一个非常有用的特性,但当您实际创建对象时,它通常是冗长的。这就是为什么我们通过内部原型继承来模拟基于类的继承(如在Ruby语言中)。这有一定的含义。
[...]
我们可以尝试在Prototype中执行相同的操作:
var Logger = Class.create({
initialize: function() { },
log: [],
write: function(message) {
this.log.push(message);
}
});
var logger = new Logger;
logger.log; // -> []
logger.write('foo');
logger.write('bar');
logger.log; // -> ['foo', 'bar']
它有效。但如果我们再创建一个Logger实例呢?
var logger2 = new Logger;
logger2.log; // -> ['foo', 'bar']
// ... hey, the log should have been empty!
您可以看到,尽管您可能期望新实例中有一个空数组,但它与以前的记录器实例具有相同的数组。事实上,所有记录器对象都将共享同一个数组对象,因为它是通过引用而不是通过值复制的。
相反,使用默认值初始化实例:
var Logger = Class.create({
initialize: function() {
// this is the right way to do it:
this.log = [];
},
write: function(message) {
this.log.push(message);
}
});