2015-06-25 53 views
3

所以我知道你可以這樣做:在沒有Object.defineProperty的情況下定義不可寫屬性?

var obj = {}; 
Object.defineProperty(obj, 'staticProp', { 
    value: 'I will never change', 
    writable: 'false' 
}); 

而且我知道你可以這樣做:

var obj = { 
    get gettableProp(){ 
     return 'gettable!' 
    } 
} 

有沒有一種方法來定義不可寫入/可枚舉/配置的屬性聲明,而不是使用Object.defineProperty(),你定義一個getter或setter的方式?

我之所以這樣問是因爲我有被傳遞的對象這樣的功能:

ObjectProcessor({ 
    // A bunch of properties 
}) 

我真的希望能夠保持這種簡單的語法情況下,當我願意包括不可寫或非枚舉的屬性,而不是做

var obj = {} 
Object.defineProperty(obj, 'staticProp', { 
    value: 'I will never change', 
    writable: 'false' 
}); 
ObjectProcessor(obj); 

回答

4

有一種方法來聲明性地定義的,而不是使用Object.defineProperty(),順便不可寫/可枚舉/可配置屬性你會定義一個get ter或setter?

(有Object.defineProperties,但我想這不是你在找什麼)

+0

好了,很爛。 D: – Zacqary

1

沒有,有沒有其他的方法(除Object.definePropertiesObject.create,讓您提供多個這些描述符)。

我真的希望能夠保持這種簡單的語法

注意Object.defineProperty返回傳遞的對象,這樣你就可以簡化您的代碼

ObjectProcessor(Object.defineProperty({}, 'staticProp', { 
    value: 'I will never change', 
    writable: 'false' 
})); 

,並避免引入那額外的obj變量。

+0

確實如此,我沒有想到defineProperty/iies會返回對象。我只是不喜歡你想傳遞一個只讀prop到你的對象的時刻,它立即使每個屬性的語法更加冗長一百萬次(尤其是因爲默認值全都是false)。 – Zacqary

+0

......當然,如果你覺得編寫重複的代碼,你總是可以寫一個小幫手函數。 – Bergi

0

用的命名慣例,你可以建立到你的ObjectProcessor:

var prefix = 'readonly_'; 

function ObjectProcessor(obj) { 
    Object.keys(obj).filter(function (name) { 
     // find property names which match your convention 
     return name.indexOf(prefix) === 0; 
    }).forEach(function (name) { 
     // make the new property readonly 
     Object.defineProperty(obj, name.substring(prefix.length), { 
      value: obj[name], 
      writable: false 
     }); 

     // remove the old, convention-named property 
     delete obj[name]; 
    }); 

    // remaining ObjectProcessor logic... 
} 

這讓你處理可寫,只讀屬性:

ObjectProcessor({ 
    readonly_id: 1, 
    name: 'Foo' 
}); 
+0

這就是我在想什麼,或者可能傳遞一個屬性對象,如果它存在,它將被傳遞給Object.defineProperties調用。基本上你可以使用普通的對象聲明語法定義任何屬性和訪問器,並將需要只讀或非枚舉的任何東西填充到該特殊屬性對象中。我會試驗這兩種方法,看看哪一種效果更好。 – Zacqary

+0

@Zacqary我認爲只讀屬性的第二個對象是個好主意,因爲它消除了偶然和錯誤地使用你的命名約定的機會。 –

+0

@Zacqary添加枚舉,可配置,......可能會使事情複雜化;在某些時候,使用'Object.defineProperties'可能會更容易。祝你好運! –

相關問題