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标记,但我的问题是为什么我的语法错误。我已经知道用你的方式会奏效。我在代码中使用的语法,如果我在对象文本中使用它,效果很好,那么为什么描述符对象失败呢?@Number945
get
set
是描述符上的键。您需要使用函数定义这些键。您正在尝试为传入的对象定义一个getter和setter-您最终为
fullName
定义了getter/setter,这使得键
get
set
未定义。那么为什么可以接受语法呢?你的推理在这里也应该适用。我已经在属性描述符上方发布了有问题的内容。请看一看。您将看到,它将把它作为数据属性!甚至连访问器属性都没有。是的,这是有效的,因为它没有被传递到
definedProperty
它为键
fullName
设置一个getter/setter
definedProperty
不会查找该属性。它将查找并尝试调用,
get()
set()
。您发布的链接中的对象没有属性
get
set
。尝试在链接的代码中调用
obj.get()
——这就是
defineProperty
将尝试执行的操作。
get fullName(){}
get(){}
set(v){}