javascript - 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"
// }
解决方案
您正在观察的是默认行为的结果Object.assign()
。
1. person1 的 'name' 属性是 'undefined'
如果该属性未在对象中定义并且仅定义了一个 setter,则任何直接访问该属性的尝试都将返回undefined
. 您应该定义属性或者它的 gettername
以person1
将其访问为person1.name
.
这就是为什么当您登录时person1
,name
是undefined
.
person1.name
正在返回未定义,因为person1
只有 asetter
并且没有getter
2. person2的'name'属性有值
当这两行被执行时,
const person2 = {}
Object.assign(person2, person1)
getter和setter不会被复制进来,Object.assign()
但会被调用并在此过程中创建新属性。由于set name(newName)
没有等价物getter
或in 的属性,因此name
inperson1
的name
属性是在 期间person2
分配的。所以这将是你的最后undefined
Object.assign()
person2
Object.assign()
person2 = { name: undefined };
没有任何 getter 或 setter。
而且,当您调用此行时
person2.name = 'z'
name 属性被赋值z
。
person2.name
正在返回值,因为person2
没有 getter 或 setter,只返回分配的值。
推荐阅读
- vba - Outlook VBA - 如何为收件箱和子文件夹运行脚本
- c# - 您要实例化的对象为空。统一 3D
- python - 使用triplet loss进行训练:Nan in summary histogram tensorflow
- java - Java JTextPane Markdown 格式 - 删除格式定义字符
- matlab - 如何在 Matlab 工作区中存储矩阵的所有列
- jupyter-notebook - 在 Jupyter 中安装 xeus-cling 后 C++14 不可见(Ubuntu 18.04 - Anaconda)
- flutter - 将 Flutter 应用程序复制到新项目时要复制哪些文件夹?
- microsoft-graph-api - 使用新的 microsoft-graph-auth 库 java sdk 会出现未经授权的错误
- python - 当我尝试重定向到生产中的注册和登录页面时出现 500 错误消息
- c# - 使用索引单例分别处理类的不同实例中的事件