【问题标题】:How can I modify the Object constructor如何修改 Object 构造函数
【发布时间】:2017-12-21 05:57:55
【问题描述】:

当我运行以下代码时

var ExtendedObject = function() {
  this.standard = 5;
};

Object = ExtendedObject.bind(Object);
var p = new Object();
console.dir(p.standard);

,输出为

5

正如预期的那样。

如果我将变量 p 实例化为像这样的对象字面量:

var ExtendedObject = function() {
  this.standard = 5;
};

Object = ExtendedObject.bind(Object);
var p = {};
console.dir(p.standard);

结果是

未定义

我正在尝试找到一种方法来修改 Object 的构造函数,以便我可以为所有正在创建的新对象添加一些标准内容。

【问题讨论】:

  • var p = {}; 为空时,结果将是未定义的显然,是的,试试var p = Object 它会工作
  • .bind(Object) 应该做什么?
  • 构造函数中的this与对象方法中的this有“定义”不同。构造函数中的this 总是指要实例化的新对象。因此,您不能将 bind 用于任何模棱两可的上下文。

标签: javascript constructor


【解决方案1】:

不,绝对不可能重新定义对象字面量的计算方式;它将始终成为具有内置 Object.prototype 的本机对象,而不是子类或任何东西,它也不会调用自定义构造函数。

这实际上是一项安全功能,因为它可以防止JSON hijacking

... 这样我就可以为所有正在创建的新对象添加一些标准内容

这是一个可怕的想法,并且会破坏您在此环境中使用的每个库(包括您自己编写的所有函数)。但是,如果您坚持在所有对象上拥有一个共同的(而不是个人的!)属性,您可以考虑defining it on Object.prototype。不是我会推荐它,但至少做得正确。

【讨论】:

    【解决方案2】:

    您可以创建一个类并从Object 扩展它。

    class MyObject extends Object {
      constructor() {
         super();
         this.standard = 5;
      }
    }
    
    const obj = new MyObject();
    console.log(obj);

    【讨论】:

    • 这是 ES6 实现,大多数现代浏览器都支持。随意使用,更多信息请参考es6-features.org/#ClassInheritance
    • 我认为 OP 的目标是让所有从 Object 继承的对象都有其设置的属性。即,即使是对象文字也会有 standard 属性。
    • 我不想这样。我基本上想在不修改已经编写的内容的情况下向应用程序添加功能。这是 BDD 的原则 - 行为驱动设计。
    【解决方案3】:

    像这样在 Object 的原型上定义属性:

    Object.defineProperty(Object.prototype, 'standard', {
      value: 5,
      writable: true,
      enumerable: true,
      configurable: true
    });
    var p = {};
    
    console.dir(p.standard);

    【讨论】:

      【解决方案4】:

      这可能是一个讨论 JavaScript 对象的有用链接。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

      【讨论】:

      • 请指出该文章的哪一部分回答了我的问题。我没看到。
      猜你喜欢
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 2012-01-18
      • 2021-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      相关资源
      最近更新 更多