对象初始化器

您所在的位置:网站首页 js创建一个新对象 对象初始化器

对象初始化器

2024-07-11 07:47| 来源: 网络整理| 查看: 265

一个形式为 __proto__: value 或 "__proto__": value 的属性定义并没有创建一个名称为 __proto__ 的属性。相反,如果提供的值是一个对象或 null 值,它将创建对象的 [[Prototype]] 指向该值(如果该值不是一个对象或 null,该对象不会被改变)。

请注意,__proto__ 键是标准化的语法,与非标准且性能不佳的 Object.prototype.__proto__ 访问器不同。它在创建对象时设置了 [[Prototype]],类似于 Object.create——而不是变更原型链。

jsconst obj1 = {}; console.log(Object.getPrototypeOf(obj1) === Object.prototype); // true const obj2 = { __proto__: null }; console.log(Object.getPrototypeOf(obj2)); // null const protoObj = {}; const obj3 = { "__proto__": protoObj }; console.log(Object.getPrototypeOf(obj3) === protoObj); // true const obj4 = { __proto__: "not an object or null" }; console.log(Object.getPrototypeOf(obj4) === Object.prototype); // true console.log(Object.hasOwn(obj4, "__proto__")); // false

在对象字面值中,仅允许有一个原型 setter;多个原型 setter 会被视为语法错误。

不使用“冒号”标记法的属性定义不是原型 setter。它们是属性定义,其行为与使用任何其他名称的类似定义相同。

jsconst __proto__ = "variable"; const obj1 = { __proto__ }; console.log(Object.getPrototypeOf(obj1) === Object.prototype); // true console.log(Object.hasOwn(obj1, "__proto__")); // true console.log(obj1.__proto__); // "variable" const obj2 = { __proto__() { return "hello"; } }; console.log(obj2.__proto__()); // "hello" const obj3 = { ["__proto__"]: 17 }; console.log(obj3.__proto__); // 17 // 将原型 setter 与正常的使用“__proto__”键的自有属性混合在一起 const obj4 = { ["__proto__"]: 17, __proto__: {} }; // {__proto__: 17} (原型为 {}) const obj5 = { ["__proto__"]: 17, __proto__: {}, __proto__: null, // SyntaxError: Duplicate __proto__ fields are not allowed in object literals }; const obj6 = { ["__proto__"]: 17, ["__proto__"]: "hello", __proto__: null, }; // {__proto__: "hello"}(原型为 null) const obj7 = { ["__proto__"]: 17, __proto__, __proto__: null, }; // {__proto__: "variable"}(原型为 null)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3