javascript中的setter

时间:2018-11-24 16:18:16

标签: javascript setter

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

2 个答案:

答案 0 :(得分:3)

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

1。 person1的“名称”属性为“未定义”

如果未在对象中定义属性,而仅定义了setter,则直接访问该属性的任何尝试都将返回undefined。您应该在name中定义属性person1,或者通过person1.name来访问它。

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

person1.name返回未定义,因为person1仅具有setter而没有getter

2。 person2的“名称”属性具有值

执行这两行后,

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

getters setters 不会复制到Object.assign()中,但是会在过程中调用它们并创建新属性。由于set name(newName)没有等效的gettername中的属性person1,因此name中的person2属性被分配了{{1 }}在undefined期间。因此,这就是您Object.assign()末尾的person2

Object.assign()

没有任何获取器或设置器。

而且,当您调用此行时

person2 = { name: undefined };

为name属性分配了值person2.name = 'z'

z之所以返回值,是因为person2.name没有getter或setter方法,只是返回分配的值。

答案 1 :(得分:0)

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

  

请注意,public void removeItem(int position){ items.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, items.size()); } 未定义,任何访问它的尝试都将导致未定义。

像您的示例一样,在前面的引用中使用

name来声明属性设置器name

因此,您已经定义了getter以返回其结果。我建议您遵循文档本身提供的示例。