1

我正在尝试在 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 没有适当的文档,我不知道这是否正常或有意。

谢谢您的帮助

4

2 回答 2

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
}
于 2012-04-13T20:27:18.650 回答
0

“options”属性位于原型对象上,这意味着它被所有实例共享。也就是说,当您this.options在该表达式中提及时,它不是将属性直接放在新对象 ( this) 上,而是更新在原型上找到的现有属性。

就拿那条线:

 options: {},

出去。

我想我会把调用Object.extend写成:

 this.options = Object.extend({}, options || {});

编辑-实际上现在我想到了,这完全是因为Object.extend直接更新了传入的第一个参数。如果您只是更改了Object.extend对它的调用,我认为会修复它,尽管实际上没有理由将其放入原型中.)

于 2012-04-13T18:04:01.147 回答