Fiddle

var Assertion = function() {
    return { "dummy": "data" };    
}

Object.defineProperty(Object.prototype, 'should', {
  set: function(){},
  get: function(){
    return new Assertion(this);
  }
});

// Insert magic here.

// This needs to be false
console.log(({}).should === undefined);

ES5中有哪些选项可以撤销defineProperty次通话?

请不要像Object.defineProperty = function() { }这样愚蠢的建议.

以下Object.defineProperty(Object.prototype, 'should', {})

not work

还有Object.defineProperty(Object.prototype, 'should', { value: undefined })

在V8引擎中抛出Uncaught TypeError: Cannot redefine property: defineProperty

Object.defineProperty(Object.prototype, 'should', { 
    set: function() {},
    get: function() { return undefined; }
});

same error

delete Object.prototype.shoulddoes not work

推荐答案

一般来说,您无法undo撤消defineProperty调用,因为没有undo撤消堆栈之类的东西.JS引擎不跟踪以前的属性描述符.

例如

Object.defineProperty(Object.prototype, 'foo', {
    configurable: true,
    value: 1,
    enumerable: false
});
Object.defineProperty(Object.prototype, 'foo', {
    get: function () {
        alert('You cannot revert me');
        return 2;
    },
    enumerable: true
});

你能做的是removereconfigure一个属性,或者overwrite它的值.如另一个答案中所述,如果要删除或重新配置,configurable标志必须是true.


要删除属性(这应该是您想要做的),请使用delete:

Object.defineProperty(Object.prototype, 'foo', {
    configurable: true, // defaults to false
    writable: false,
    value: 1
});
delete Object.prototype.foo;
console.log(Object.prototype.hasOwnProperty('foo')); // false

要重新配置,请再次使用defineProperty并传递不同的描述符:

Object.defineProperty(Object.prototype, 'foo', {
    configurable: true,
    get: ...
    set: ...
});
Object.defineProperty(Object.prototype, 'foo', {
    value: undefined
});
console.log({}.foo); // undefined
console.log(Object.prototype.hasOwnProperty('foo')); // true

如本示例所示,可以使用defineProperty在访问器(get/set)和数据(value)属性之间切换.


要覆盖,请使用简单赋值.在本例中,需要将writable标志设置为true.显然,这不适用于访问器属性.它甚至抛出了一个例外:

Object.defineProperty(Object.prototype, 'foo', {
    configurable: true,
    value: 1,
    writable: true // defaults to false
});
Object.prototype.foo = undefined;
console.log(Object.prototype.foo); // undefined
console.log(Object.prototype.hasOwnProperty('foo')); // true

Object.defineProperty(Object.prototype, 'foo', {
    get: function () {
        return 1;
    },
    writable: true // JS error!
});

请注意,当使用defineProperty时,writable默认为false,但当使用简单语法o.attr = val;定义(以前不存在)属性时,writable默认为true.

Node.js相关问答推荐

无法验证叶签名|无法验证第一个证书

需要关于基于角色授权的设计建议

MongoDB上的updateOne和findOneAndUpdate在Node.js中无法正常工作

findoneandupdate()方法更新数据库,但其响应在请求中返回为null

AWS-ROUTE 53指向S3存储桶,错误是别名目标名称不在目标区域内

找不到 vue-template-compiler@2.6.14 的匹配版本 | Shopware 6.5 更新后的 node 问题

如何修复node.js中的错误代码无法加载资源:服务器响应状态为403(禁止)

如何在 require 方法中使用路径与node.js react ?

使用NodeJS通过服务账号列出Google Workspace用户

错误 node :错误:绑定消息提供 16 个参数,但准备语句需要 15 个

MongoDB - 查找查询以判断是否存在少量字段,结合字段上的 AND

在快速路由中使用 axios 会在数据字段中返回特殊字符而不是 json

如何使用填充在mongoose 上保存新数据

使用 Forms API 进行批量更新时生成 itemId

bash:npm:找不到命令?

如何在 NodeJS 中获取操作系统用户名?

如何在 Mongoose 模式中设置数组大小限制

为什么我会收到错误:解决方法指定过多?

如何从命令行在 Node.js 上运行 Jasmine 测试

如何从 Node.js 中的 URL 获取