簡體   English   中英

原型1.7 Object.extend在原型類中使用時不起作用

[英]Prototype 1.7 Object.extend doesn't work as it should when used in prototype class

我正在嘗試在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的適當文檔,因此我不知道這是正常的還是預期的。

謝謝您的幫助

“ options”屬性位於原型對象上,這意味着它被所有實例共享。 也就是說,當您在該表達式中提及this.options時, 並不是將屬性直接放在新對象( this )上,而是更新了原型中的現有屬性。

只要走那行:

 options: {},

出來。

我想我將對Object.extend的調用寫為:

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

編輯 —實際上,現在我想到了,這是因為Object.extend直接更新了傳入的第一個參數。如果您只是更改了對Object.extend的調用,那么我認為它可以解決,盡管實際上沒有理由仍將其放在原型中。)

除非只是因為您的代碼段不完整,否則您實際上並沒有進行任何“對象擴展”,因此您可以這樣做:

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM