为什么 setter with set keyword and function expressed in ES5 throws syntax error?

Why setter with set keyword and function expressed in ES5 throws syntax error?

为什么当函数以 ES5 方式表达时定义 setter 会抛出语法错误,但在 ES6 中表达时却有效。

Setter 使用 ES5 语法(不起作用)

var person = {
  firstName: "John",
  lastName : "Doe",
  language : "",
  set setLanguage: function(val) {
     this.language = val    
  },
  get getLanguage() {
     return this.language   
  }     
}

person.setLanguage = 'EN'
person.getLanguage
`Uncaught SyntaxError: Unexpected token :`

Setter 使用 ES6 语法(有效)

var person = {
  firstName: "John",
  lastName : "Doe",
  language : "",
  set setLanguage(val) {
     this.language = val    
  },
  get getLanguage() {
     return this.language   
  }     
}

person.setLanguage = 'EN'
person.getLanguage

谢谢

您没有在对象中正确定义方法,请阅读此 --> Method definitions also this Defining getters and setters

var person = {
  firstName: "John",
  lastName : "Doe",
  language : "",
  set setLanguage(val) {
     this.language = val    
  },
  get getLanguage() {
     return this.language   
  }     
}

person.setLanguage = 'EN'
console.log(person.getLanguage)

你的第二个例子不是 ES6 特定的,它是有效的 ES5 语法:

set setLanguage(val) {
    this.language = val;    
},

来自Object Initialiser's specification (ES5)

PropertyAssignment :
PropertyName : AssignmentExpression
get PropertyName ( ) { FunctionBody }
set PropertyName ( PropertySetParameterList ) { FunctionBody }

如您所见,PropertyName 后有一个 :,但 getter 中没有 :function或 setter

更新:

您可能混淆了计算的属性名称getters/setters

的概念

ES6 introduced 计算的 属性 名称,所以你可以这样做(这个片段可能不适用于旧浏览器,比如 IE):

const person = {
  language: "",
  setLanguage(val){
    this.language = val;
  },
  getLanguage(){
    return this.language;
  }
}

person.setLanguage("EN");

console.log("person.language", person.language);
console.log("person.getLanguage()",person.getLanguage())

注意缺少 setget 关键字,您必须调用 person.setLanguage("EN"); 而不是 person.setLanguage = "EN";

在 ES5 中,您必须(将 const 更改为 var 并)使用:

setLanguage: function(val) {
    this.language = val;    
},
getLanguage: function() {
    return this.language;    
},