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
?
除了语法之间的明显区别之外,简洁和非简洁方法本质上是相同的吗?
答案 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"
说明:
首先记录所有对象; frenchPerson
,englishPerson
和multilinguist
使用简洁方法语法。
您可以看到,speak
对象的名为multilinguist
的 concise 方法利用super.speak()
指向它的对象原型(无论哪个可能是这样。)
将multilinguist
的原型设置为frenchPerson
之后,我们调用multilinguist
的{{1}}方法-答复/记录:
speak()
然后我们将Bonjour, Hola
的原型设置为multilinguist
,然后再次要求englishPerson
到multilinguist
-这次它答复/记录:
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