为什么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"
// }
答案 0 :(得分:3)
您正在观察的是Object.assign()
的默认行为的结果。
如果未在对象中定义属性,而仅定义了setter,则直接访问该属性的任何尝试都将返回undefined
。您应该在name
中定义属性person1
,或者通过person1.name
来访问它。
这就是为什么当您登录person1
时,name
是undefined
。
person1.name
返回未定义,因为person1
仅具有setter
而没有getter
执行这两行后,
const person2 = {}
Object.assign(person2, person1)
getters 和 setters 不会复制到Object.assign()
中,但是会在过程中调用它们并创建新属性。由于set name(newName)
没有等效的getter
或name
中的属性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以返回其结果。我建议您遵循文档本身提供的示例。