我试图在javascript中使用简单的OOP模型但不知何故我失败了。我写了一个简单的代码来演示我的问题:
<html>
<head>
<title>Test</title>
<script src="scriptaculous/prototype.js"></script>
<script type="text/javascript">
var Person = Class.create({
options : {},
initialize: function(id, options) {
this.id = id;
Object.extend(this.options, options || {});
},
speak: function() {
console.log(this.options);
}
});
var person1 = new Person("abcd12",{
name : "Jon Doe",
age : 23
});
var person2 = new Person("cdef34",{
name : "Jane Doe",
age : 32
});
person1.speak();
//Object { name="Jane Doe", age=32}
person2.speak();
//Object { name="Jane Doe", age=32}
</script>
</head>
<body>
</body>
</html>
显然这根本不是我想要实现的,因为没有适当的Object.extend文档,我不知道这是正常的还是有意的。
感谢您的帮助
答案 0 :(得分:0)
“options”属性位于原型对象上,这意味着它由所有实例共享。也就是说,当你在该表达式中提到this.options
时,不将属性直接放在新对象(this
)上,而是更新原型上发现的现有属性。
请走这条路:
options: {},
进行。
我想我会把Object.extend
的来电写为:
this.options = Object.extend({}, options || {});
(编辑 - 实际上现在我考虑过它,因为Object.extend
直接更新传入的第一个参数。如果您刚刚将调用更改为Object.extend
我认为它已经解决了,但无论如何都没有理由把它放在原型中。)
答案 1 :(得分:0)
除非是因为你的代码片段不完整,否则你实际上并没有做任何'对象扩展',所以你可以这样做:
var Person = Class.create({
initialize: function(id, options) {
this.id = id;
this.options = options;
},
...
});
以下是如何使用Object.extend将传入的options
属性与默认属性合并的示例:
var Person = Class.create({
initialize: function(id, options) {
this.id = id;
this.options = Object.extend({
prop1: 'defaultValue1',
bool1: true
}, options);
},
...
});
使用此代码,如果您这样做:
var person = new Person('idString', {prop1: 'custom prop 1'});
然后person.options
会产生:
{
prop1: 'custom prop 1',
bool1: true
}