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

标签 javascript properties overriding getter-setter defineproperty

我有一些代码在原型(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/

相关文章:

javascript - 在 resizable() 之后定位 DIV

javascript - 图像源更改,jquery 在事件完成之前未完成

javascript - 根据顺序更改深层嵌套 Javascript 对象中同名属性的多个值

javascript - 可以向类型化数组添加属性吗?

java - 压倒一切的麻烦

java - 方法重写时出现异常问题

javascript - 第二次调用函数时,图 1 挂起

javascript - 是否可以将 VAST 与动态创建的视频标签一起使用?

properties - 获取元素高度

django - 如何发布到 allauth 注册表以填写初始数据?