对象文字构造函数

Object literal constructor

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

示例:

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

我想当我使用文字定义一个对象时,对象构造函数会被调用,所以我确实覆盖了 Object.prototype.constructor 但它只在我做 new Object({a:1,b:2})

时被调用

问题更简单地说,任何人都可以在不将对象 o 传递给函数或代理或使用 o.a=3with 关键字的情况下创建 a=3,其中 o 是使用对象文字定义?

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

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

当前您正在执行 o.a===3,这将 return Boolean 值而不是覆盖 属性 a 的值。

您也不能在 console.log() 中执行 o.a=3 因为 o.a=3 将 return 赋值 3 但它仍会更改 属性 ao3

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

question in simpler terms can anyone make a=3 without passing the object o to a function or a proxy?

  o.a = 3;

I am looking for a way to modify an object that was defined by a literal without passing it into another function.

那是不可能的,因为如果有可能,你可以打破 javascript 的每一块。那将是可怕的。

哦等等,这是 JS...

 with({ get o() { return { a: 3 }; }, set o(v) {} }) {

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

 }

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

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

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

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

检查以下示例:

var a = 1;

var o = { a: a };

a = 2;

console.log(o.a, a);

使用像 new Number() 这样的对象构造函数也无济于事,因为那会 return 对对象的引用( 通过引用传递 根据需要),但为其分配一个新值,读取该值仍然是 returns 原始值(再次由 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])