继承属性是否阻止设置实际属性?

时间:2018-03-15 11:23:34

标签: javascript

我试图继承默认规范属性,这样,当我在继承规范中创建特定的覆盖值时,我仍然可以访问(通过继承)未修改的规范值:



let default_boltSpec = {
  head_diameter: 2,
  shaft_diameter: 0.8,
};
Object.freeze(default_boltSpec);

let derivedBoltSpec = Object.create(default_boltSpec);
console.log( "derivedBoltSpec:", derivedBoltSpec );

Object.assign(derivedBoltSpec , {
  head_diameter: 1.5,
});




奇怪的是,我似乎不允许"覆盖"继承了价值观!如何严格地在原型链上的值会干扰我允许放在我的对象上的属性?

编辑: 此屏幕截图显示了在Firefox Web开发人员控制台中运行上述代码段的效果: enter image description here

此图像显示Object.create不会向创建的对象添加任何属性。这与the documentation一致。

1 个答案:

答案 0 :(得分:1)

你冻结了这个物体。这也将冻结属性值。

从上下文来看,我认为您要使用的是seal而不是freeze。例如,

let default_boltSpec = {
  head_diameter: 2,
  shaft_diameter: 0.8,
};
Object.seal(default_boltSpec);

let derivedBoltSpec = Object.create(default_boltSpec);

Object.assign(derivedBoltSpec , {
  head_diameter: 1.5,
});
console.log( derivedBoltSpec)

Here are the docs for seal

编辑:您必须再次使属性可写。您可以使用Object.defineProperty执行此操作。但是你基本上是循环遍历所有属性并使它们可写。例如,

Object.defineProperty(derivedBoltSpec 'head_diameter:', { value: 1.5, enumerable: true, configurable: true, writable: true });