Prototype 1.7 Object.extend在原型类中使用时不能正常工作

时间:2012-04-13 17:59:41

标签: javascript oop object prototypejs

我试图在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文档,我不知道这是正常的还是有意的。

感谢您的帮助

2 个答案:

答案 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
}