gpt4 book ai didi

javascript - Object.defineProperty 无法识别 getter 或 setter 语法

转载 作者:行者123 更新时间:2023-12-02 21:51:09 25 4
gpt4 key购买 nike

考虑下面的代码:

"use strict";

var obj = {
firstName : "abhay",
lastName : "Deol"
};


Object.defineProperty(obj, "fullName" , {

get fullName(){
return this.firstName + this.lastName;
},

set fullName(value){
let words = value.toString().split(' ');
this.firstName = words[0];
this.lastName = words[1];
},

enumerable : true,
configurable : true
});

console.log(Object.getOwnPropertyDescriptor(obj,"fullName"));
obj.fullName = "good boys"; // Error

我收到以下错误:

TypeError: Cannot assign to read only property 'fullName' of object '#<Object>'
at Object.<anonymous>
at Module._compile (internal/modules/cjs/loader.js:955:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:991:10)
at Module.load (internal/modules/cjs/loader.js:811:32)
at Function.Module._load (internal/modules/cjs/loader.js:723:14)
at Function.Module.runMain (internal/modules/cjs/loader.js:1043:10)
at internal/main/run_main_module.js:17:11

它似乎无法识别 setter 。另外,如果我尝试获取值,它会给我undefined。这表明,getter 还没有被识别。但为什么呢?

在上面的代码中,它将其识别为数据属性而不是访问器属性。显然描述符对象不接受 getter/setter 语法。但为什么 ?这可以通过以下输出来证明-

console.log(Object.getOwnPropertyDescriptor(obj,"fullName"));

作为

{
value: undefined,
writable: false,
enumerable: true,
configurable: true
}

如果我在对象文字中使用它,我在 getter/setter 代码中使用的语法可以正常工作,那么为什么描述符对象会失败呢?我的意思是下面的代码是可以接受的,但是上面的代码语法是不行的!

var obj = {

firstName : "abhay",
lastName : "Deol",

get fullName(){
return this.firstName + this.lastName;
},

set fullName(value){
let words = value.toString().split(' ');
this.firstName = words[0];
this.lastName = words[1];
}
};

最佳答案

这不是正确的语法:

get fullName(){}

您需要在对象上定义键 getset,以便 descriptorObject.get().set( ) 是可调用的。您正在为描述符对象上的属性 fullName 定义 getter 和 setter,但 defineProperty() 并不查找 fullName

根据 MDN:

An accessor descriptor also has the following optional keys:
get ...
set ...

您传递的对象没有定义这些键。

尝试仅使用:

get(){}
set(v){}

例如:

"use strict";

var obj = {
firstName : "abhay",
lastName : "Deol"
};


Object.defineProperty(obj, "fullName" , {
get(){
return this.firstName + this.lastName;
},

set(value){
let words = value.toString().split(' ');
this.firstName = words[0];
this.lastName = words[1];
},
enumerable : true,
configurable : true
});

console.log(obj, obj.firstName)
obj.fullName = "good boys";
console.log(obj, obj.fullName)

关于javascript - Object.defineProperty 无法识别 getter 或 setter 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60129525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com