ECMAScript 6 的方法和 Super 引用

317 阅读1分钟

在 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 方法了。

(完)