首页 > Object.create 第一个参数中有不可写属性时,子对象不可重新赋值,请问为什么?

Object.create 第一个参数中有不可写属性时,子对象不可重新赋值,请问为什么?

var a = {};
Object.defineProperty(a, 'x', { value: 42, enumerable: true, configurable: true  }); 
var b = Object.create(a);
b.x = 50; 

console.log(b.x);  // 10
console.log(b.hasOwnProperty('x'));  //false
  

如图所示,当Object.create 函数使用了a对象为原型对象,创建新对象b的时候,由于a对象中的x属性是不可写的( writable默认为false ),造成的结果是b对象只能获取到原型上的属性x,而不能对b对象自身赋值x,为什么?(使用的是chrome浏览器),请大神们帮忙解惑,万分感谢


https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

《你不知道的JavaScript上卷》 5.1.2属性设置和屏蔽

你的问题就是这里的第二种情况!

引用:
对于属生x不直接存在于b中而是存在于原型链上层时b.x = 50;会出现三种情况!

  1. 如果在Prototype链上层存在名为x的普通数据访问属性并且没有被标记为只读(writable:false),那么就会在b中添加一个名为x的新属性,它是屏蔽属性。

  2. 如果在Prototype链上层存在foo,但它被 标记为只读(writable:false),那么无法修改已有属性或者在b上创建屏蔽属性。严格模式下代码会抛出一个错误。否则赋值语句被忽略

  3. 如果Prototype链上层存在x并且它是一个setter,那就一定会调用这个setter,x不会被添加到b,也不会重新定义x这个setter.

"use strict";
var a = {};
Object.defineProperty(a, 'x', { value: 42, enumerable: true, configurable: true  }); 
var b = Object.create(a);
b.x = 50; 
【热门文章】
【热门文章】