【问题标题】:ES6 super() in constructor and prototype methods构造函数和原型方法中的 ES6 super()
【发布时间】:2017-07-29 19:19:05
【问题描述】:

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

第二: 为什么我们不能实例化 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()

为什么?对于上面的问题,我也想知道更多关于什么实现是这样做的,而不是他们为什么决定提供这个功能。

【问题讨论】:

  • 在 ES5 中你不能实例化一个函数,我相信如果你只做 var b= a.func() 就可以工作
  • 请提出一个问题,而不是两个。

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


【解决方案1】:

我的意思是,如果我想在 ES5 中做同样的事情以使“this”不可用,该怎么做。

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

为什么我们不能实例化 ES6 原型方法 下面不行

因为方法定义,类似于箭头函数,不是构造函数。不像function 表达式,既可以调用也可以构造。

【讨论】:

    【解决方案2】:

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

    当您为构造函数执行new something() 时,会实例化一个新对象,并可通过this 使用。虽然 ES6 类扩展了其他类,但由于super(),将沿着链上链并实例化基础对象。

    换句话说:

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

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

    这就是为什么 this 永远不会设置在 super() 之前的原因,因为扩展某些东西的类不会自己创建新对象。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-06
      • 2018-03-17
      • 2019-06-07
      • 2011-10-30
      • 2013-02-18
      • 2015-10-16
      • 2017-07-23
      • 2015-10-10
      相关资源
      最近更新 更多