Javascript Object.defineProperty无法识别getter或setter语法
考虑以下代码:Javascript Object.defineProperty无法识别getter或setter语法,javascript,Javascript,考虑以下代码: "use strict"; var obj = { firstName : "abhay", lastName : "Deol" }; Object.defineProperty(obj, "fullName" , { get fullName(){ return this.firstName + this.lastName; }, set fullName(value){ let words =
"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
作为
我在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(){}
您需要在对象上定义键get
和set
,以便descriptorObject.get()
和.set()
可以调用。您正在为描述符对象上的属性fullName
定义getter和setter,但是definedProperty()
没有查找fullName
根据MDN:
访问器描述符还具有以下可选键:获取…
设置 正在传递的对象未定义这些键 试着只使用:
get(){}
set(v){}
例如:
“严格使用”;
var obj={
名字:“abhay”,
姓氏:“迪欧”
};
Object.defineProperty(obj,“全名”{
得到(){
返回this.firstName+this.lastName;
},
设置(值){
让words=value.toString().split(“”);
this.firstName=单词[0];
this.lastName=单词[1];
},
可枚举:正确,
可配置:true
});
console.log(obj,obj.firstName)
obj.fullName=“好孩子”;
log(obj,obj.fullName)
Thnx标记,但我的问题是为什么我的语法错误。我已经知道用你的方式会奏效。我在代码中使用的语法,如果我在对象文本中使用它,效果很好,那么为什么描述符对象失败呢?@Number945get
和set
是描述符上的键。您需要使用函数定义这些键。您正在尝试为传入的对象定义一个getter和setter-您最终为fullName
定义了getter/setter,这使得键get
和set
未定义。那么为什么可以接受语法呢?你的推理在这里也应该适用。我已经在属性描述符上方发布了有问题的内容。请看一看。您将看到,它将把它作为数据属性!甚至连访问器属性都没有。是的,这是有效的,因为它没有被传递到definedProperty
它为键fullName
设置一个getter/setterdefinedProperty
不会查找该属性。它将查找并尝试调用,get()
和set()
。您发布的链接中的对象没有属性get
或set
。尝试在链接的代码中调用obj.get()
——这就是defineProperty
将尝试执行的操作。
get fullName(){}
get(){}
set(v){}