为何无法访问对象的fullName?类setter栈溢出原因解析
JavaScript类Setter栈溢出与属性访问问题的原因解释
一、同名Setter导致栈溢出的原因
当你在类中定义了与属性同名的set fullName方法后,JavaScript会把对this.fullName的赋值操作自动重定向到这个setter方法,而非直接给实例添加fullName属性。
在构造函数里执行this.fullName = fullName时,实际是调用了set fullName方法。如果此时setter方法内部又尝试给this.fullName赋值(比如最初没改变量名时的逻辑),就会再次触发setter方法,形成无限递归调用——每次调用setter都会触发新的setter调用,直到调用栈长度超过JavaScript引擎的限制,最终抛出“栈溢出”错误。
二、修改变量名后原属性无法访问的原因
当你把setter里的赋值目标改成this._fullName后,构造函数里的this.fullName = fullName依然是调用setter方法,这时候实例上只会被添加_fullName这个属性,并没有fullName属性被直接定义在实例上。
而你没有定义对应的get fullName方法,当尝试访问jessica.fullName时,JavaScript会先在实例自身查找fullName属性,找不到就去原型链上找,由于原型上只有setter没有getter,最终会返回undefined,也就是你说的“原属性fullName无法访问”。
内容的提问来源于stack exchange,提问作者Bilal Zahid Shah
相关产品推荐
相关产品推荐

