2011-10-13 25 views
35

Bir nesne obj verildiğinde, salt okunur özellik 'prop' tanımlamak ve değerini val olarak ayarlamak istiyorum. Bunu yapmanın doğru yolu bu mu?Salt okunur özelliklerini tanımlamada JavaScript

Object.defineProperty(obj, 'prop', { 
    get: function() { 
     return val; 
    } 
}); 

sonuç (val = 'test' için) olmalıdır:

obj.prop; // 'test' 
obj.prop = 'changed'; 
obj.prop; // still 'test' since it's read-only 

Bu yöntem btw çalışır: http://jsfiddle.net/GHMjN/
ben bunu yapmak için en kolay/akıcı/en uygun yolu ise sadece emin değilim ...

+0

Olası kopya: http://stackoverflow.com/questions/366047/can-read-only-properties-be-implemented-in-pure-javascript (Eski tarayıcıları desteklemek istemiyorsanız, yönteminiz en iyisi) –

cevap

64

Bunun yerine, get erişim noktasına sahip olan writable özelliğini tanımlayabilirsiniz: get erişim noktası:

var obj = {}; 
Object.defineProperty(obj, "prop", { 
    value: "test", 
    writable: false 
}); 

Bu ECMAScript 5, dolayısıyla eski tarayıcılarda çalışmaz.

+0

Kodumun ve kodunuzun "dışarıda" aynı sonucu üretip üretmediğinden emin değilim, ancak yönteminiz bunu yapmak için daha doğru bir yoldur. –

0

Eski tarayıcılardan dolayı (geriye dönük uyumluluk) özellikler için erişimci işlevlerini bulmam gerekiyordu. Ben yardımcı olur umarım

var obj = { }; 
//declare read-only property. 
bob.prop.namedProp(obj, 'name', 'Bob', true); 
//declare read-write property. 
bob.prop.namedProp(obj, 'age', 1); 

//get values of properties. 
console.log(bob.string.formatString('{0} is {1} years old.', obj.get_name(), obj.get_age())); 
//set value of read-write property. 
obj.set_age(2); 
console.log(bob.string.formatString('Now {0} is {1} years old.', obj.get_name(), obj.get_age())); 

//cannot set read-only property of obj. Next line would throw an error. 
// obj.set_name('Rob'); 

//Output: 
//======== 
// Bob is 1 years old. 
// Now Bob is 2 years old. 

: Ben bob.js bir parçası yaptılar.

+0

Wait, '.namedProp (obj, 'foo')', nesnenin kendisinde '.get_foo()',/'.set_foo()' oluşturur? Bu çok verimli değil. Sanırım bir ambalajcı ile giderdim. 'X (obj) .set ('foo') '/' X (obj) .get ('foo') '. –

+0

Açıklama: Sanırım iki farklı şeyden bahsediyoruz. Gerçek nesneyi etrafında bir sarıcı bulundururken değişmeden tutmak isteyebilirsiniz; ama gerçek nesneyi değiştirmeyi ve özellikleri temsil eden fonksiyonlara sahip olmayı önerdim. Geriye dönük uyumluluk için, eski stil JavaScript özellikleri alanlar olarak kabul edilebilir. Böylece, bunun için erişimciler (işlevler) sahibi olmanız gerekir (ayrıca geleneksel JS özelliklerini gerçek nesneden kaldırmanızı öneririm, böylece özellikler üzerinde tam kontrol sahibi olurdum). Sarmalayıcılar hakkında, bu da kötü değil, ama benim yaklaşımımdan farklı. – Tengiz

İlgili konular