从me.name = 'forceddd' 开始

me.name = 'forceddd' 的赋值语句在JavaScript中是随处可见的。但是,我们真的了解这句代码做了什么事情吗?是创建了一个新属性吗?是修改了原有属性的值吗?这次操作是成功还是失败了呢?这只是一行简单的赋值语句,但如果我们认真思考的话,就会发现这种细节其实也没有那么简单。
万物皆可分类讨论。首先分为两类情况:对象 me 上已有 name 属性和没有 name 属性。
当然,我们都知道,JavaScript中存在着原型链机制,所以当对象 me 中不存在 name 属性时,也可以分为两种情况: me 的原型链上存在 name 属性与不存在 name 属性。也就是可以分为三类来讨论。
从me.name = 'forceddd' 开始
文章图片

  1. me中已存在name属性
    const me = { name: 'me', }; me.name = 'forceddd'; console.log(me.name); //forceddd

    在这种情况下显然我们的目的是重新设置 name 属性的值,结果似乎也是显而易见的,me.name 被修改成了 'forceddd'
    但是不要忘记了,一个对象的属性也是拥有它自己的属性的,其中就包括是否是只读的(writable),(通常用于描述一个对象的某个属性的各种特性的对象被称为属性描述符或者是属性描述对象),所以当name属性的可写性(writable)为 false 时,结果会是什么样的呢?不仅如此, name 属性定义了 getter 或者 setter 函数,成为一个访问描述符的时候,结果又会是怎么样的呢?