Ole*_*ral 4 javascript ecmascript-6 es6-class
我正在读这本书.检查"15.6.4.2陷阱:使用超级的方法无法移动 "部分
它陈述如下
你不能移动使用super的方法:这样的方法有内部插槽[[HomeObject]],它将它与创建它的对象联系起来.如果你通过赋值移动它,它将继续引用超级属性原始对象.
所以,我试图用不同的对象调用它,也将实例方法分配给不同的对象,但它似乎不起作用.它指的是新对象的属性.可能,我没有弄清楚作者的意思.那么,有人可以提供一个例子吗?
她是一个小型演示和下面的代码
class A {
get a() {
return 1;
}
sayHi() {
console.log(this.a)
}
}
class B extends A {
sayHi() {
super.sayHi();
};
}
var obj = {
a: 4
};
let b = new B();
b.sayHi();
// logs 1
b.sayHi.call(obj);
// logs 4
obj.sayHi = b.sayHi;
obj.sayHi();
// logs 4
Run Code Online (Sandbox Code Playgroud)
你的代码没问题,因为this当你移动一个方法时却有效,但是super没有(并且你的代码只是真的测试过this).以下代码测试super:
class Bird {
getName() {
return 'Bird';
}
}
class Mammal {
getName() {
return 'Mammal';
}
}
class Human extends Mammal {
getName() {
return super.getName();
}
}
class Duck extends Bird {
}
// Moving method .getName() from Human.prototype to Duck.prototype
Duck.prototype.getName = Human.prototype.getName;
console.log(new Duck().getName()); // 'Mammal' (not 'Bird')
Run Code Online (Sandbox Code Playgroud)
要理解结果,您需要了解super它[[HomeObject]]是如何工作的 - 它使用存储在方法本身中的内部属性,它不依赖于它this.也就是说,Human.prototype.getName()内部工作如下:
Human.prototype.getName = Object.assign(
function me() {
return me.__HomeObject__.__proto__.getName();
},
{ __HomeObject__: Human.prototype }
);
Run Code Online (Sandbox Code Playgroud)
书中解释了更多细节:http://exploringjs.com/es6/ch_classes.html#superproperties
| 归档时间: |
|
| 查看次数: |
346 次 |
| 最近记录: |