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

「オプション」プロパティはプロトタイプ オブジェクトにあります。つまり、すべてのインスタンスで共有されます。つまりthis.options、その式で言及すると、新しいオブジェクト ( ) にプロパティを直接配置するのではなく、プロトタイプにある既存のプロパティを更新しています。this

その行を取るだけです:

 options: {},

アウト。

私は次のように呼び出しを書くと思いますObject.extend

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

編集— 実際に考えてObject.extendみると、渡された最初のパラメーターを直接更新するためです。呼び出しを変更しただけObject.extendで修正されると思いますが、とにかくプロトタイプに入れる理由は本当にありません.)

于 2012-04-13T18:04:01.147 に答える