JavaScript:为什么 getOwnPropertyDescriptor() 包含自定义的继承属性?

标签 javascript node.js prototype javascript-objects

我正在学习 JavaScript 和 Node.js,我对 Object.getOwnPropertyDescriptor() 函数有疑问。考虑以下顶级代码:

var rectangle = {
    width: 10,
    height: 5,
    get area() {
        return this.width * this.height;
    }
};

Object.prototype.x = 5;

var areaPropDesc = Object.getOwnPropertyDescriptor(rectangle, "area");

for (var attr in areaPropDesc) {
    console.log("areaPropDesc["+attr+"] is: "+areaPropDesc[attr]);
}

当我执行上面的代码时,这是输出:

areaPropDesc[get] is: function area() {
        return this.width * this.height;
    }
areaPropDesc[set] is: undefined
areaPropDesc[enumerable] is: true
areaPropDesc[configurable] is: true
areaPropDesc[x] is: 5

为什么 x 属性包含在 area 属性的属性描述符对象中?!

最佳答案

问题是 areaPropDesc 是一个继承自 Object.prototype 的对象。

由于您创建了 Object.prototype.x 可枚举属性,当您使用 for...in 迭代对象时,您将看到该属性。

为了避免这种情况,您可以

  • 使 x 不可枚举:

    Object.defineProperty(Object.prototype, 'x', {
        value: 5,
        configurable: true,
        writable: true
    });
    
  • 过滤for...in中的非自有属性:

    for (var attr in areaPropDesc) if(areaPropDesc.hasOwnProperty(attr) {
        /* ... */
    }
    

关于JavaScript:为什么 getOwnPropertyDescriptor() 包含自定义的继承属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27079929/

相关文章:

JavaScript 命令在 Safari 中未按顺序执行

javascript - 许多小的或一个更大的 POST 请求?

javascript - 如何正确地将 ES6 模块函数导出为库以在 Node 应用程序中使用?

javascript - 如何在另一个函数的回调中调用 JavaScript 函数?

javascript:如何向greasemonkey/prototype 中的表添加列?

javascript - 将我的 Javascript 数组放入表中

javascript - TypeScript/JavaScript 中的 array.indexOf

javascript - 如何在同一模板上显示项目总数和项目限制列表

javascript - 使用nodejs查询MongoDb

以枚举值作为参数的 Javascript 构造函数