【问题标题】:Object literal constructor对象字面量构造函数
【发布时间】:2018-09-15 09:05:17
【问题描述】:

我正在寻找一种方法来修改由文字定义的对象而不将其传递给另一个函数。

示例:

let o = {a:1,b:2}
console.log(o.a===3)

我认为当我使用字面量定义对象时,会调用 Object 构造函数,所以我确实覆盖了Object.prototype.constructor,但只有在我执行new Object({a:1,b:2}) 时才会调用它

用更简单的术语来说,任何人都可以在不将对象 o 传递给函数或代理或使用 o.a=3with 关键字(其中 o 使用对象字面量定义)的情况下生成 a=3 吗?

【问题讨论】:

  • 这听起来像XY problem。您要解决的具体问题是什么?
  • @vlaz 使每个 javascript 对象都可观察,而无需将其传递给另一个函数
  • 我希望 Javascript 更改一个值,但我不想指定该值在哪里。这基本上就是您要告诉我们的?
  • @Delta 就问题而言,它没有任何意义,因此无法回答。请扩展它并解释您提到的具体要求。为什么不能将它传递给函数?为什么不能只分配一个值?
  • @DanielHilgarth 我想隐式地做到这一点,例如通过覆盖构造函数,但我找不到对象文字的构造函数

标签: javascript object prototype object-literal


【解决方案1】:

只需执行o.a=3; 和控制台日志o

let o = {a:1,b:2};
o.a=3;
console.log(o);

目前您正在执行o.a===3,它将返回Boolean 值,而不是覆盖属性a 的值。

您也不能在console.log() 中执行o.a=3,因为o.a=3 将返回分配的值3,但它仍会将o 的属性a 更改为3

let o = {
  a: 1,
  b: 2
};
//won't print o but changes o.a to 3
console.log(o.a = 3);

【讨论】:

  • 来吧,开个玩笑,我知道这是一个有效的答案,但我的意思是在构造对象后没有访问属性
  • 我没有得到你想要完成的内容
【解决方案2】:

这根本不可能。
没有对象字面量的构造函数。
您可以通过不同的方式创建对象:

  • 通过对象字面量
  • 通过构造函数
  • 通过Object.create

另外,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer

【讨论】:

    【解决方案3】:

    用更简单的术语来说,任何人都可以在不将对象 o 传递给函数或代理的情况下使 a=3 吗?

      o.a = 3;
    

    我正在寻找一种方法来修改由文字定义的对象而不将其传递给另一个函数。

    那是不可能的,因为如果有可能你可以破坏每一段 javascript。那太可怕了。

    哦等等,这是 JS……

     with({ get o() { return { a: 3 }; }, set o(v) {} }) {
    
      o = {a:1,b:2};
      console.log(o.a===3) // true
    
     }
    

    【讨论】:

      【解决方案4】:

      如果o.a 持有对变量a 的引用,则可以实现您想要实现的目标——不幸的是,这仅适用于通过引用传递的变量。不过,像 StringNumberBoolean 这样的原始类型是按值传递的

      查看以下示例:

      var a = 1;
      
      var o = { a: a };
      
      a = 2;
      
      console.log(o.a, a);

      使用像 new Number() 这样的 Object 构造函数也无济于事,因为它确实返回了对对象的引用(根据需要通过引用传递),但是分配一个读取该值的新值仍然返回一个原语(再次由 value 传递):

      var a = new Number(1);
      
      var o = { a: a.valueOf() };
      
      a = Number(2);
      
      console.log(o.a, a);

      如果你传递的东西自然是通过引用传递的,那么你的期望就满足了:

      var a = [ 1 ]
      
      var o = { a: a }
      
      a[0] = 2
      
      console.log(o.a[0])

      【讨论】:

        最近更新 更多