2012-07-27 40 views
6

作爲在javascript初學者,我試圖從這裏的Object.create方法以JavaScript

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

在該示例代碼理解的Object.create()方法,線18,一種存取屬性與創建可寫設置爲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

+0

是mozilla引用不正確? – John 2012-07-27 05:42:57

+0

Mozilla的參考確實是不正確的。這是一個wiki,所以我只是登錄並修復它。 (他們很快就推出了一個新wiki,所以你可能還沒有看到這個修復,這取決於你是否參加了測試版,我認爲。) – apsillers 2012-07-27 05:52:30

回答

12

問題是writableset/get是互斥的。代碼生成在Chrome這是很有幫助的錯誤:

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

這使得一些邏輯意義:如果你有一個屬性set/get存取,該屬性是永遠不會被寫入和/或讀取,因爲任何嘗試讀/寫它將被訪問函數攔截。如果您定義的屬性爲writable給它訪問器功能,您同時說:

  1. 「這個屬性的值可以直接修改,」和
  2. 「阻止所有試圖讀取和/或者寫入這個屬性,而是使用這些函數。「

錯誤只是阻止你指定一個矛盾。我假設你寫了一個getter和setter,你並不希望這個屬性是writable。只要刪除該行,並且您的代碼完美運行。

+1

+1。只要從'bar'刪除'writable:true'位,就可以了。 – Amadan 2012-07-27 04:51:19

+0

我想那麼mozilla的參考是錯誤的。 – John 2012-07-27 05:36:05

+0

@John你可能會對John Resigs發表關於ECMAScript 5的博客文章感興趣:http://ejohn.org/blog/ecmascript-5-objects-and-properties/ – 2012-07-27 06:09:01

10

遲到的答案,不尋找投票,但希望這會有所幫助。

有兩種屬性。每個屬性可以是:

  1. 具有這四個屬性的數據屬性

    • 可寫
    • 枚舉
    • 配置
  2. 訪問屬性它具有以下四個屬性:

    • 得到
    • 設置
    • 枚舉
    • 配置

因此,沒有任何財產可以兼得getwritable。這就是JavaScript的方式!請參閱ECMAScript Standard的8.6節瞭解血淋淋的細節。

+0

這個回答對我很有幫助。即使我將可寫入設置爲false,我也遇到了同樣的錯誤。現在我明白了,因爲我定義了一個'get',這個屬性是'訪問器屬性',因此爲'可寫'設置任何值都是非法的(即使你設置爲false) – 2014-02-24 12:55:51