5

Bir prototipte bir alıcıyı tanımlayan bir kodum var (ancak ilgili ise ayarlayıcı yoksa). Geri dönen değer% 99.99 oranında doğrudur; bununla birlikte, amaç, belirli bir nesne için farklı bir değere değerlendirmek üzere özelliği ayarlamaktır. o atanabilir olan öyle ki mülkiyet x, varolan nesne için geçersiz kılınabilir nasıl Bir prototipte tanımlanmış (get-) özelliği nasıl "geçersiz kılınır"?

foo = {} Object.defineProperty(foo, "bar", { // only returns odd die sides get: function() { return (Math.random() * 6) | 1; } }); x = Object.create(foo); x.bar // => eg. 5 x.bar = 4 // by fair dice roll x.bar // nope => eg. 3 

,
(örn. varsayılan özellik davranışı vardır)?

Ek: x tanımlanan yeni bir özellik olsa da (değer veya/set olsun), ben "bar" var durağında [prototip] bir özelliğinin davranışı için bir yoldur ve açarsanız arıyorum Belirli bir örnek için normal/ad-hoc özellik geri dönün. kullanarak

cevap

5

Object.definePropertyx tarih:

var foo = {} 
 
Object.defineProperty(foo, "bar", { 
 
    // only returns odd die sides 
 
    get: function() { return (Math.random() * 6) | 1; } 
 
}); 
 

 
var x = Object.create(foo); 
 
display(x.bar);  // E.g. 5 
 

 
(function() { 
 
    var bar; 
 
    var proto = Object.getPrototypeOf(x); // Or just use foo 
 

 
    Object.defineProperty(x, "bar", { 
 
    get: function() { return typeof bar !== "undefined" ? bar : proto.bar; }, 
 
    set: function(value) { bar = value; } 
 
    }); 
 
})(); 
 

 
display(x.bar); // Still odd 
 
x.bar = 4;  // By fair dice roll 
 
display(x.bar); // Shows 4 
 

 
function display(msg) { 
 
    document.body.insertAdjacentHTML("beforeend", "<p>" + msg + "</p>"); 
 
}

ben "bar [prototip] bir özelliğe davranışını durdurmak ve açmak için bir yol olup olmadığını arıyorum "normal/ad-hoc özellikte.

Tamam, bu biraz farklı, ama yine de Object.defineProperty kullanır:

var foo = {} 
 
Object.defineProperty(foo, "bar", { 
 
    // only returns odd die sides 
 
    get: function() { return (Math.random() * 6) | 1; } 
 
}); 
 

 
var x = Object.create(foo); 
 
display(x.bar);  // E.g. 5 
 

 
Object.defineProperty(x, "bar", { 
 
    value: undefined, 
 
    writable: true, 
 
    enumerable: true // Or leave off if you want it non-enumerable 
 
}); 
 

 
display(x.bar); // undefined 
 
x.bar = 4;  // By fair dice roll 
 
display(x.bar); // Shows 4 
 

 
function display(msg) { 
 
    document.body.insertAdjacentHTML("beforeend", "<p>" + msg + "</p>"); 
 
}

+0

Zeki. Soruya bazı düzenlemeler yaptım (esas olarak bir cümlecik/cümle sonunda). Özellikle, belirli bir örnekte özellik tanımını basitçe "kaldırmanın" bir yolu var mı? – user2864740

+0

@ user2864740: Hayır, örnekte prototipin özelliğini gizleyen bir özellik oluşturmanız gerekiyor; Eğer istediğiniz gibi olmasaydı (tanımlanamaz hale getirir), her zaman "undefined" i dönüştürebilirsiniz: Object.defineProperty (x, "bar", {value: undefined}) ; –

+0

@ user2864740: İkinci bir snippet ekledim; Soruyu yukarıdaki yorumu okuyarak, biraz farklı olduklarını düşünüyorum. HTH. –

İlgili konular