为什么super使用方法语法但不使用属性语法?

时间:2016-11-11 03:41:00

标签: javascript ecmascript-6

我正在运行Node 6.9.1。

我定义了一个这样的基础对象:

const base = {
  value : 10,
  getFinalValue : function() {
     return this.value
  }
}

现在我想为getFinalValue方法定义一个修饰符。

我的第一次尝试是使用新的ES6 super关键字:

const modifier = Object.create(base)
modifier.getFinalValue = function () {
  return super.getFinalValue() + 20
}

但是,上面的代码给出了以下错误:

> SyntaxError: 'super' keyword unexpected here

我试过了:

// With Object.defineProperties within Object.create
const modifier = Object.create(base, {
  getFinalValue : { 
    value : function () {
      return super.getFinalValue() + 20
    }
   }
})

// And with Object.setPrototypeOf

const modifier = {
  getFinalValue : function () {
    return super.getFinalValue() + 20
  }
}

Object.setPrototypeOf(modifier, base)

结果是同样的错误。

但是,如果我使用新的ES6方法语法:

const modifier = {
  getFinalValue() {
    return super.getFinalValue() + 20
  }
}

Object.setPrototypeOf(modifier, base)

modifier.getFinalValue() // 30 (yay!)

它运作得很好。

如果我使用Object.getPrototypeOf代替super,则可以使用属性语法:

const modifier = {
  getFinalValue: function () {
    return Object.getPrototypeOf(this).getFinalValue.call(this) + 20
  }
}

Object.setPrototypeOf(modifier, base)

modifier.getFinalValue() // 30 (Yay!)

有人可以向我解释为什么会这样吗?

P.S。:是的,我知道我混合了ES5和ES6语法,但这是故意的。

1 个答案:

答案 0 :(得分:0)

  

但是,如果我使用新的ES6方法语法......它可以正常工作。

这就是重点。常规功能中不允许superspecification

  

如果FormalParameters包含SuperProperty,则为语法错误。

     

如果FunctionBody包含SuperProperty,则为语法错误。

     

如果FormalParameters包含SuperCall,则为语法错误。

     

如果FunctionBody包含SuperCall为真,则为语法错误。

原因是只有在其环境记录中设置字段的方法,才允许JS引擎解析super的值。方法声明不仅仅是语法糖。