gpt4 book ai didi

javascript - 如何 "override"原型(prototype)上定义的(get-)属性?

转载 作者:可可西里 更新时间:2023-11-01 02:38:31 29 4
gpt4 key购买 nike

我有一些代码在原型(prototype)上定义了一个 getter(但没有 setter,如果相关的话)。返回的值在 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

如何为现有对象 x 覆盖该属性,使其可分配(例如,具有默认属性行为)?

附录:虽然可以在 x 上定义新属性(值或获取/设置),但我正在寻找是否有办法停止 [prototype] 中属性的行为,并且将“bar”变回特定实例的普通/临时属性。

最佳答案

通过在 x 上使用 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

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

I am looking for if there is a way to stop the behavior of a property in the [prototype] and turn "bar" back into a normal/ad-hoc property.

好吧,这有点不同,但仍然使用 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>");
}

关于javascript - 如何 "override"原型(prototype)上定义的(get-)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26296497/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com