无法移动使用super的方法

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)

Axe*_*yer 7

你的代码没问题,因为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