Setter 在 javascript

Setter in 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"
    // }

Link 到 CodePen:https://codepen.io/anon/pen/ZmoMzj?editors=1112

如文档中的 example 所示,它指出:

Note that name is not defined and any attempts to access it will result in undefined.

name 在前面的引述中用于声明 属性 setter name,如您的示例。

因此,您已经将 getter 定义为 return 它的结果。我建议您按照文档本身提供的示例进行操作。

您观察到的是 Object.assign().

默认行为的结果

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

如果对象中没有定义属性,只定义了setter,任何直接访问属性的尝试都会return undefined.您应该在 person1 中定义 属性 name 或 getter 以将其访问为 person1.name.

这就是为什么当您登录 person1 时,nameundefined

person1.name 未定义 return 因为 person1 只有 setter 而没有 getter

2。 person2 的 'name' 属性 有一个值

这两行执行时,

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

getterssetters 未复制到 Object.assign() 中,但它们是调用并在此过程中创建新属性。由于 set name(newName) 没有等效的 getterperson1 中的 属性 name,因此 name 属性 31=] 在 Object.assign() 期间被分配 undefined。所以这将是 Object.assign()

末尾的 person2
person2 = { name: undefined };

没有任何 getter 或 setter.

并且,当您调用此行时

person2.name = 'z' 

名称 属性 被分配了值 z

person2.name 是 return 值,因为 person2 没有 getter 或 setter,只有 returns 赋值。