构造函数和原型方法中的ES6 super()

时间:2017-07-29 19:19:05

标签: javascript ecmascript-6 super es6-class function-prototypes

我有两个问题 第一: 我最近了解到在ES 6派生类中,如果没有调用super(),则“this”不可用。 我理解为什么这样做,但我想从概念上知道,ES6编译的代码是什么让“这个”不可用。我的意思是如果我想在ES5中做同样的事情以使“这个”不可用,那怎么办呢。

第二: 为什么我们无法实例化ES6原型方法 下面不起作用 -

class abc{
func(){}
}

var a = new abc()
var b = new a.func()

虽然这样可行 -

function abc(){}

abc.prototype.func = function(){}

var a = new abc()
var b = new a.func()

为什么?对于上述问题,我想了解更多关于实施的内容,而不是为什么他们决定提供此功能。

2 个答案:

答案 0 :(得分:3)

  

我的意思是如果我想在ES5中做同样的事情来制作"这个"不可用,怎么办呢。

这是不可能的。这种行为在ES6中是新的(并且很难转换)。

  

为什么我们无法实例化ES6原型方法以下不起作用

因为类似于箭头函数的方法定义不是构造函数。与function表达式不同,可以同时调用和构造它。

答案 1 :(得分:1)

使用扩展实例化对象的ES6类与构造函数的方式不同。

当你为构造函数执行new something()时,会有一个新对象被实例化并可通过this获得。虽然扩展其他类的ES6类将上升到链并实例化基础对象,感谢super()

换句话说:

class C extends B {}
class B extends A {}
class A {}
new C();

实际上会一直走到A,看到它不是一个使用extend的类,并且会实例化那个(有一个扭曲,对象的原型将是C的原型)。对C和B的super次调用会将this设置为返回的超级值。

这就是this永远不会在super()之前设置的原因,因为扩展某些内容的类本身不会创建新对象。

关于第2点,类元素是方法(不能构造),而构造函数原型上的函数是作为构造函数的普通函数。