在 ECMAScript 6 之前,从未有过对“方法”的正式定义。在 ECMAScript 6 中,将方法定义为一个函数,具有一个内部的 [[HomeObject]] 属性,指向方法隶属的对象。
let person = {
getGreeting() {
return 'Hello';
}
};
function shareGreeting() {
return 'Hi';
}
person
中的 getGreeting()
就是方法,它有一个内部的 [[HomeObject]] 属性,指向 person
自身;而 shareGreeting()
是一个函数,没有 [[HomeObject]] 属性。
ECMAScript 6 还引入了 Super 引用,它是一个指针,指向对象的原型。Super 引用写在对象里时,必须 放在对象简写方法里才能使用,否则报语法错误。
const proto = {
greet() {
return 'hello'
}
}
/*
下面这种使用 super 的方式是不行的
let person = {
getGreeting:function() {
// 语法错误 :(
return super.greet() + ', how are you?';
}
};
*/
let person = {
getGreeting() {
// 没问题 :)
return super.greet() + ', how are you?';
}
};
Object.setPrototypeOf(person, proto) // 将 person 的原型对象设置为 proto
person.getGreeting() // "hello, how are you?"
简写方法里的 Super 引用是通过方法自身的 [[HomeObject]] 属性,找到正确原型对象的。
上一个例子中的
return super.greet() + ', how are you?';
// 等同于
return Object.getPrototypeOf(容纳 [[HomeObject]] 属性的方法所隶属的对象).greet.call(this) + ', how are you?';
// 即
return Object.getPrototypeOf(this).greet.call(this) + ', how are you?';
这样我们就能顺利调用 person
原型对象上的 greet
方法了。
(完)