Javascript 如何从原型重新定义属性?

Javascript 如何从原型重新定义属性?,javascript,defineproperty,Javascript,Defineproperty,如何从对象的原型中删除属性p var Test = function() {}; Object.defineProperty(Test.prototype, 'p', { get: function () { return 5; } }); Object.defineProperty(Test.prototype, 'p', { get: function () { return 10; } }); 这将产生TypeError:无法重新定义属性:p。有没有办法删除该属性并重新添加?或

如何从对象的原型中删除属性
p

var Test = function() {};
Object.defineProperty(Test.prototype, 'p', {
  get: function () { return 5; }
});

Object.defineProperty(Test.prototype, 'p', {
  get: function () { return 10; }
});

这将产生TypeError:无法重新定义属性:p。有没有办法删除该属性并重新添加?或者,是否可以在创建属性后设置
可配置属性
属性?

如果可以在要避免的代码之前运行代码,则可以尝试劫持
对象。定义属性
以防止添加该属性:

var _defineProperty = Object.defineProperty;
Object.defineProperty = function(obj, prop, descriptor) {
    if(obj != Test.prototype || prop != 'p')
        _defineProperty(obj, prop, descriptor);
    return obj;
};
或者,您可以对其进行配置,以便以后能够对其进行修改:

var _defineProperty = Object.defineProperty;
Object.defineProperty = function(obj, prop, descriptor) {
    if(obj == Test.prototype && prop == 'p')
        descriptor.configurable = true;
    return _defineProperty(obj, prop, descriptor);
};
最后,您可以恢复原始的:

Object.defineProperty = _defineProperty;

你试过这样的东西吗?但它必须在创建新的
Test
实例之前运行

var Test = function () {};

Object.defineProperties(Test.prototype, {
    p: {
        get: function () {
            return 5;
        }
    },

    a: {
        get: function () {
            return 5;
        }
    }
});

Test.prototype = Object.create(Test.prototype, {
    p: {
        get: function () {
            return 10;
        }
    }
});

var t = new Test();

console.log(t.a, t.p);

当然,您需要将其定义为可配置的。原始定义不是我的,所以我不能这样做。属性是在外部库中定义的。您可以将原型链更深一层(从测试继承并将属性放在中间)或在实例上重写它(即do
function MyTest(){t=new Test();t.p=…;return t;}
否。我正试图在库加载之后和执行之前,在库中注入错误修复。您能够在该代码之前运行代码吗?还是必须在之后运行?这应该可以工作,您可以将属性定义为的参数,而不是在之后调用
对象。defineProperty
。@Xotic750是的,我只是太懒了,没有复制/通过e所以我再一次复制/粘贴了你的;)这是一个糟糕的解决方案,但这是我找到的唯一一个,而且似乎效果很好,所以我会选择它。