5

मेरे पास कुछ कोड है जो प्रोटोटाइप पर गेटटर (लेकिन कोई सेटटर नहीं है, यदि ऐसा प्रासंगिक है) को परिभाषित करता है। 99.99% मामलों में लौटाया गया मूल्य सही है; हालांकि, लक्ष्य एक विशिष्ट वस्तु के लिए एक अलग मूल्य के मूल्यांकन के लिए संपत्ति सेट करना है।प्रोटोटाइप पर परिभाषित (प्राप्त करें) संपत्ति को "ओवरराइड" कैसे करें?

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 

कैसे संपत्ति एक्स, किसी मौजूदा ऑब्जेक्ट के लिए अधिरोहित जा सकता है, ऐसी है कि वह आबंटित है (जैसे। डिफ़ॉल्ट गुण व्यवहार है)?

परिशिष्ट: (मूल्य या प्राप्त/सेट) एक नया संपत्ति जबकि एक्स पर परिभाषित कर सकते हैं, मैं अगर वहाँ रोक में [प्रोटोटाइप] एक संपत्ति के व्यवहार का एक तरीका है और "बार" बारी रहा हूँ विशिष्ट उदाहरण के लिए एक सामान्य/विज्ञापन-संपत्ति में वापस।

उत्तर

5

का उपयोग करके Object.definePropertyx पर:

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>"); 
 
}

मैं अगर वहाँ में [प्रोटोटाइप] एक संपत्ति के व्यवहार बार रोकने के लिए और बारी "एक तरीका है के लिए देख रहा हूँ "वापस एक सामान्य/विज्ञापन-संपत्ति में।

ठीक है, कि थोड़ा अलग है, लेकिन अभी भी Object.defineProperty उपयोग करता है:

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

चालाक। मैंने प्रश्न में कुछ संपादन किए (मुख्य रूप से अंत में एक खंड/वाक्य)। मुख्य रूप से, क्या किसी विशेष उदाहरण से संपत्ति परिभाषा को "निकालने" का कोई तरीका है? – user2864740

+0

@ user2864740: नहीं, आपको उस उदाहरण पर अपनी संपत्ति बनाना है जो प्रोटोटाइप की संपत्ति को मुखौटा करता है; यदि आप चाहें तो इसे हमेशा 'अपरिभाषित' वापस कर सकते हैं (और इसे गैर-गणना योग्य बना सकते हैं), जो थोड़ा सा होगा जैसा कि वहां नहीं था: 'ऑब्जेक्ट.डेफिनप्रॉपर्टी (एक्स, "बार", {वैल्यू: अपरिभाषित}) ; –

+0

@ user2864740: मैंने एक दूसरा स्निपेट जोड़ा है; उपरोक्त टिप्पणी बनाम प्रश्न पढ़कर, मुझे लगता है कि वे थोड़ा अलग हैं। HTH। –

संबंधित मुद्दे