gpt4 book ai didi

javascript - 将新属性分配给具有卡住原型(prototype)的空对象

转载 作者:行者123 更新时间:2023-11-28 07:26:30 26 4
gpt4 key购买 nike

为什么我不能将新属性分配给具有卡住原型(prototype)的非卡住对象:

在没有 Object.freeze 的情况下工作:

'use strict'
//This object will be prototype of next objects
var defaults = {
name: 'def name',
sections: {
1: {
secName: 'def sec name'
}
}
};

//So we have an empty object with prototype set to our default object.
var specificObject = Object.create(defaults);


specificObject.sections = {};
console.log(specificObject.hasOwnProperty('sections')); //true

specificObject.sections['1'] = Object.create(defaults.sections['1']);

上面的代码按预期工作,但我想确保默认值不会被意外更改。所以我想卡住我的默认对象:

'use strict'
//This object will be prototype of next objects
var defaults = {
name: 'def name',
sections: {
1: {
secName: 'def sec name'
}
}
};

//!!!!!!!!!!!!
Object.freeze(defaults);

//So we have an empty object with prototype set to our default object.
var specificObject = Object.create(defaults);

//TypeError: Cannot assign to read only property 'sections' of #<Object>
specificObject.sections = {};
console.log(specificObject.hasOwnProperty('sections')); //true

specificObject.sections['1'] = Object.create(defaults.sections['1']);

我不明白的是,如果它的原型(prototype)被卡住,为什么我不能分配给特定对象?

//编辑:请注意,特定对象没有被卡住:

'use strict'
//This object will be prototype of next objects
var protoObj = {a: 1, o: {}};
Object.freeze(protoObj);

console.log(Object.isFrozen(protoObj)); //true

var n = Object.create(protoObj);
console.log(Object.isFrozen(n)); //false

最佳答案

What I don't get is why can't I assign to specificObject if its prototype is frozen?

因为property属性是继承的。是的,这很奇怪。

如果卡住对象,它会将所有数据属性的 [[writable]] 属性设置为 false

如果您分配给一个对象属性,但该属性在该对象上不存在,它将去原型(prototype)上查找它 - 它可能被定义为那里的setter。当此查找返回并表示存在该名称的属性但不可写时,您的分配将失败(并在严格模式下抛出)。

你能采取什么措施来应对这种情况?

  • 使用Object.defineProperty而不是赋值,它不会检查原型(prototype)
  • 或者类似地,使用Object.create的第二个参数创建自己的属性
  • 仅在分配给 specifiedObject 后才卡住默认值

关于javascript - 将新属性分配给具有卡住原型(prototype)的空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29602584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com