6

JavaScriptの初心者なので、ここから Object.create() メソッドを理解しようとしました

https://developer-new.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create

コード例の 18 行目。writable が true に設定されたアクセサ プロパティが作成されます。また、書き込み可能はデータ記述子専用であることも読みました。

走ってみたり、

var o = Object.create(Object.prototype, {
  // foo is a regular "value property"
  foo: { 
    writable:true, configurable:true, value: "hello" 
  },
  // bar is a getter-and-setter (accessor) property
  bar: {
    writable: true,
    configurable: false,
    get: function() { return 10 },
    set: function(value) { console.log("Setting `o.bar` to", value) }
  }
  });
console.log(o); 

私は得るinvalid property error

4

2 に答える 2

12

問題は、writableset/getが相互に排他的であることです。このコードは、Chrome で次の役立つエラーを生成します。

Invalid property. A property cannot both have accessors and be writable...

これはいくつかの論理的な意味があります:プロパティにset/getアクセサーがある場合、そのプロパティへの書き込みおよび/または読み取りは行われません。これは、読み取り/書き込みの試みがアクセサー関数によってインターセプトされるためです。プロパティを as として定義し、それにアクセサ関数を与えると、同時に次のようになりますwritable

  1. 「このプロパティの値は直接変更できます」、および
  2. 「このプロパティへの読み取りおよび/または書き込みの試みをすべてブロックします。代わりに、これらの関数を使用してください。」

このエラーは、単に矛盾を指定することを妨げているだけです。あなたがゲッターとセッターを書いたという事実から、プロパティを本当にしたくないと思いますwritable。その行を削除するだけで、コードは完全に実行されます。

于 2012-07-27T04:50:16.487 に答える
10

回答が遅く、投票を探していませんが、これが役立つことを願っています。

プロパティには 2 種類あります。各プロパティは次のいずれかです。

  1. 次の 4 つの属性を持つデータ プロパティ:

    • 価値
    • 書き込み可能
    • 列挙可能な
    • 設定可能
  2. または、次の 4 つの属性を持つアクセサー プロパティ:

    • 得る
    • 設定
    • 列挙可能な
    • 設定可能

したがって、 と の両方getを持つことができるプロパティはありませんwritable。それがJavaScriptのやり方です!詳細については、 ECMAScript 標準のセクション 8.6 を参照してください。

于 2012-07-27T05:40:34.253 に答える