【问题标题】:Prototype 1.7 Object.extend doesn't work as it should when used in prototype classPrototype 1.7 Object.extend 在原型类中使用时不能正常工作
【发布时间】:2012-04-26 02:48:13
【问题描述】:

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

感谢您的帮助

【问题讨论】:

标签: javascript oop object prototypejs


【解决方案1】:

除非只是因为你的代码 sn-p 不完整,否则你实际上并没有做任何“对象扩展”,所以你可以这样做:

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
}

【讨论】:

    【解决方案2】:

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

    只要走那条线:

     options: {},
    

    出去。

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

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

    (edit - 实际上现在我想起来了,这都是因为Object.extend 直接更新了传入的第一个参数。如果你只是将调用更改为Object.extend 它会修复我认为,虽然实际上没有理由将它放在原型中。)

    【讨论】:

    • 谢谢,没想到 :)
    猜你喜欢
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多