【问题标题】:ES6 concise methods and non-concise methods in object literalsES6 对象字面量中的简洁方法和非简洁方法
【发布时间】:2018-06-21 08:11:53
【问题描述】:
let module = {
     add: function(a, b){
        return parseInt(a) + parseInt(b);
     },

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

与@987654323 使用的传统非简洁 方法语法相比,使用简洁 方法语法(例如sub acove)的根本区别是什么@?

concisenon-concise 方法除了语法有明显区别外,本质上是一样的吗?

【问题讨论】:

  • 使用简洁的方法有什么优缺点吗?
  • 或带箭头功能:add = (a, b) => a + b
  • @axiac 不。这只是对象初始化器的简写方法符号。
  • @Xufox 你没有,但就像小提琴一样,arguments 似乎工作正常?
  • @CertainPerformance 我说 property 不存在。 module.sub.hasOwnProperty("prototype") === falsemodule.sub.hasOwnProperty("arguments") === false

标签: javascript ecmascript-6


【解决方案1】:

一个显着的区别是简洁方法可以使用super关键字,而非简洁(又名:传统)方法不能.这在更改对象原型以帮助继承时变得相关。

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


示例:

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. 如您所见,multilinguist 对象的名为speak简洁 方法利用super.speak() 指向它的对象原型(无论是哪个)。

  3. 在将multilinguist 的原型设置为frenchPerson 后,我们调用multilinguistspeak() 方法-回复/记录:

    Bonjour, Hola

  4. 然后我们将multilinguist 的原型设置为englishPerson 并再次询问multilinguistspeak() - 这次它回复/记录:

    Hello, Hola


multilinguistspeak() 方法不简洁时会发生什么?

当在multilinguist 对象中使用不简洁speak() 方法时,除了super 引用它返回:

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

补充说明:

用一个不简洁的方法来实现上述; call() 可用作super 的替代品,如下所示:

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

// Non-concise method utilizing `call` instead of `super`
const multilinguist = {
  speak: function() {
    return `${Object.getPrototypeOf(this).speak.call(this)}, Hola!`
  }
};

Object.setPrototypeOf(multilinguist, englishPerson);

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

【讨论】:

  • 请注意,方法与super 关键字兼容的原因是因为它们被分配了一个内部[[HomeObject]] 属性(请参阅规范的9.2.12 部分)。 [[HomeObject]] 属性对应于定义方法的对象,然后可以使用该对象获取该对象的原型。
  • Nicholas Zakas 的 Understanding ES6 中的 More Powerful Prototypes 章节给出了一个很好的例子,说明最后的代码 sn-p 不能完美地替代 super。跨度>
猜你喜欢
  • 2020-09-24
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多