ES6对象文字中的简洁方法和非简洁方法

时间:2018-06-21 08:11:54

标签: javascript ecmascript-6

let module = {
     add: function(a, b){
        return parseInt(a) + parseInt(b);
     },

    sub(a, b){
        return parseInt(a) - parseInt(b);
    }
};

concise 方法所使用的传统 non-concise 方法语法相比,使用 concise 方法语法(例如sub acove)的基本区别是什么? add

除了语法之间的明显区别之外,简洁非简洁方法本质上是相同的吗?

1 个答案:

答案 0 :(得分:2)

一个明显的区别是 concise 方法可以利用super关键字和 non-concise (又称​​传统)方法不能。这在更改对象原型以帮助继承时变得很重要。

为证明这一点,请考虑以下要点:


示例:

const frenchPerson = {
  speak() {
    return 'Bonjour';
  }
};

const englishPerson = {
  speak() {
    return 'Hello';
  }
};

const multilinguist = {
  speak() {
    return `${super.speak()}, Hola`
  }
};

console.log(frenchPerson.speak()) // -> "Bonjour"
console.log(englishPerson.speak()) // -> "Hello"

Object.setPrototypeOf(multilinguist, frenchPerson);
console.log(Object.getPrototypeOf(multilinguist) === frenchPerson); // true

console.log(multilinguist.speak()); // -> "Bonjour, Hola"

Object.setPrototypeOf(multilinguist, englishPerson);
console.log(Object.getPrototypeOf(multilinguist) === englishPerson); // true

console.log(multilinguist.speak()); // -> "Hello, Hola"


说明:

  1. 首先记录所有对象; frenchPersonenglishPersonmultilinguist使用简洁方法语法。

  2. 您可以看到,speak对象的名为multilinguist concise 方法利用super.speak()指向它的对象原型(无论哪个可能是这样。)

  3. multilinguist的原型设置为frenchPerson之后,我们调用multilinguist的{​​{1}}方法-答复/记录:

      

    speak()

  4. 然后我们将Bonjour, Hola的原型设置为multilinguist,然后再次要求englishPersonmultilinguist-这次它答复/记录:

      

    speak()


Hello, Hola的{​​{1}}方法不简洁时会发生什么?

multilinguist对象中使用speak()对象中的非简洁 speak()方法时,它还会返回:

  

multilinguist

如以下示例所示:

super

附加说明:

通过非简洁方法实现上述目标; call()可以代替Syntax Error,如下所示:

const englishPerson = {
  speak() {
    return 'Hello';
  }
};

const multilinguist = {
  speak: function() {           // <--- non-concise method
    return `${super.speak()}, Hola`
  }
};

Object.setPrototypeOf(multilinguist, englishPerson);

console.log(multilinguist.speak()); // -> Syntax Error