0

Object.create についてもっと学ぼうとして、 Object.create(): the New Way to Create Objects in JavaScript に出くわしました。

上記のページの例:

var Car2 = Object.create(null); //this is an empty object, like {}
Car2.prototype = {
  getInfo: function() {
    return 'A ' + this.color + ' ' + this.desc + '.';
  }
};

var car2 = Object.create(Car2.prototype, {
  //value properties
  color:   { writable: true,  configurable:true, value: 'red' },
  //concrete desc value
  rawDesc: { writable: false, configurable:true, value: 'Porsche boxter' },
  // data properties (assigned using getters and setters)
  desc: { 
    configurable:true, 
    get: function ()      { return this.rawDesc.toUpperCase();  },
    set: function (value) { this.rawDesc = value.toLowerCase(); }  
  }
}); 
car2.color = 'blue';
alert(car2.getInfo()); //displays 'A blue PORSCHE BOXTER.'

質問:

  1. 上記の例はどれくらい正しいですか? この答えは、上記の例と矛盾しているようです。rawDescのゲッター/セッターを介してのみ変更できるプライベートメンバーになる可能性があるという考えを与えるようですdesc。これは何らかの形で役に立ちますか?

  2. descまた、使用する値を設定しようとしてcar2.desc = 'Merc'もうまくいかないようです。どうしてこんなことに?

  3. Object.defineProperty と Object.create のどの部分が似ていますか?

リサーチ:

やや関連する質問:構成不可能なプロパティ記述子の [列挙可能性と] 書き込み可能性を設定できるのはなぜですか? 値を削除writable: falsevalue: 'Porsche boxter'て設定しようとしましたが、役に立ちませんでした。

4

1 に答える 1

0

いくつかのコメント:

var Car2 = Object.create(null); //this is an empty object, like {}

コメントはあまり正しくありません。の内部プロトタイプCar2(つまり、その[[Prototype]]) は になるnullため、 のプロパティを継承しませんがObject.prototype、 を使用して作成されたオブジェクトは継承{}します。

Car2.prototype = {
  ...
};

var car2 = Object.create(Car2.prototype, {

Car2これは関数ではなく、コンストラクターとして使用することも、標準の Object メソッドを継承することもできないため、作成するのは無意味に思えます。に割り当てられたオブジェクトの単なるプレースホルダーですCar2.prototype。しかし、これはほんの一例だと思います。

質問は…</p>

上記の例はどれくらい正しいですか? この答えは、上記の例と矛盾しているようです。

例とどのように矛盾しますか?

また、 car2.desc = 'Merc' を使用して desc の値を設定しようとしてもうまくいかないようです。どうしてこんなことに?

desc実際には のセッターが変更されますrawDescが、rawDescに設定されているためwriteable: falseです。に変更するwriteable: trueと、値が変更されます。しかし、それはとにかくパブリック プロパティであるため、他のプロパティを設定してその値を設定するのは少し無意味です。

Object.defineProperty と Object.create のどの部分が似ていますか?

Object.createObject.definePropertyは ECMA-262 では隣接しており、解決するのは難しくありません。基本的に、1 つ目は既存のオブジェクトにプロパティを追加するだけで、2 つ目は新しいオブジェクトを作成して設定します[[Prototype]](つまり、コンストラクタと同等です)。

于 2013-03-21T09:10:46.353 に答える