JavaScript中的Setter

3
为什么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


1
你的setter必须实际设置某些内容来存储值。然后你没有name的getter。Object.assign()只进行浅拷贝,因此在person2中setter已经消失了。你想要做什么? - charlietfl
可能是JavaScript getters和setters入门?的重复问题。 - Ferdinando
为什么person1的'name'属性是'undefined',而person2的'name'属性有值?这是因为你的setter没有做任何事情,只是记录了该值。而Object.assign()会调用getter和setter,但不会创建新的getter和setter。 - Rainbow
2个回答

3
您所观察到的是Object.assign()默认行为的结果。
1. person1的"name"属性是undefined
如果对象中没有定义该属性,只有setter被定义,任何直接访问该属性的尝试都将返回undefined。您应该在person1中定义属性name或其getter以作为person1.name访问它。
这就是为什么当您记录person1时,name是undefined的原因。 person1.name返回undefined,因为person1只有一个setter而没有getter。
2. person2的"name"属性有一个值
当执行这两行代码时,
const person2 = {}
Object.assign(person2, person1)
getterssettersObject.assign()中不会被复制,但它们会被调用并在过程中创建新属性。由于set name(newName)没有等效的getter或者在person1中没有name属性,所以在Object.assign()期间,person2name属性被赋值为undefined。因此,在Object.assign()结束时,这将是您的person2
person2 = { name: undefined };

没有任何getter或setter。
当您调用此行时:
person2.name = 'z' 

name属性被赋值为z

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


很好的解释了为什么会发生这种情况。 - charlietfl

0

正如文档中所演示的示例,它指出:

请注意,name未定义,任何尝试访问它的操作都将导致未定义。

name在上述引用中用于说明属性设置器name,就像您的示例一样。

因此,您需要定义getter来返回其结果。我建议您遵循文档提供的示例。


啊,我有点想法。刚刚想到并更新了。谢谢。 - Bhojendra Rauniyar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接