5

我有一些代碼定義一個getter(但沒有setter,如果這是相關的)原型。返回的值在99.99%的情況下是正確的;但是,目標是將屬性設置爲針對特定對象評估不同的值。如何「覆蓋」原型上的定義(get-)屬性?

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 

如何屬性被覆蓋了X,現有的對象,使得其分配(例如,具有默認屬性的行爲)?

附加說明:雖然可以在x上定義新的屬性(值或get/set),但我正在尋找是否有辦法通過停止屬性在[prototype]中的行爲並將「bar」回到特定實例的正常/臨時屬性。

回答

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 2014-10-10 09:52:58

+0

@ user2864740:不,你必須在實例上創建一個自己的屬性來掩蓋原型的屬性;如果你想讓它總是返回undefined,那麼它會有點像它不在那裏:Object.defineProperty(x,「bar」,{value:undefined}) ;' – 2014-10-10 09:54:43

+0

@ user2864740:我已經添加了第二個片段;在閱讀上面的問題和上面的評論之後,我認爲他們略有不同。 HTH。 – 2014-10-10 09:57:20