首页 > 解决方案 > javascript中的设置器

问题描述

为什么 person1 的 'name' 属性是 'undefined' 而 person2 的 'name' 属性有值?

    const person1 = {
        set name(newName) {
            console.log(newName)
        }
    }
    
    const person2 = {}
    Object.assign(person2, person1)
    
    person1.name = 'x'  
    // logs "x"
    
    person2.name = 'z' 
    // doesnt log anything
    
    console.log("Person1", person1)
    // "Person1" Object {
    //   name: undefined
    // }
    
    console.log("Person2", person2)
    // "Person2" Object {
    //   name: "z"
    // }

CodePen 链接:https ://codepen.io/anon/pen/ZmoMzj?editors=1112

标签: javascriptsetter

解决方案


您正在观察的是默认行为的结果Object.assign()

1. person1 的 'name' 属性是 'undefined'

如果该属性未在对象中定义并且仅定义了一个 setter,则任何直接访问该属性的尝试都将返回undefined. 您应该定义属性或者它的 getternameperson1将其访问为person1.name.

这就是为什么当您登录时person1nameundefined.

person1.name正在返回未定义,因为person1只有 asetter并且没有getter

2. person2的'name'属性有值

当这两行被执行时,

const person2 = {}
Object.assign(person2, person1)

gettersetter不会被复制进来,Object.assign()但会被调用并在此过程中创建新属性。由于set name(newName)没有等价物getter或in 的属性,因此nameinperson1name属性是在 期间person2分配的。所以这将是你的最后undefinedObject.assign()person2Object.assign()

person2 = { name: undefined };

没有任何 getter 或 setter。

而且,当您调用此行时

person2.name = 'z' 

name 属性被赋值z

person2.name正在返回值,因为person2没有 getter 或 setter,只返回分配的值。


推荐阅读