我有两个问题 第一: 我最近了解到在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()
为什么?对于上述问题,我想了解更多关于实施的内容,而不是为什么他们决定提供此功能。
答案 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点,类元素是方法(不能构造),而构造函数原型上的函数是作为构造函数的普通函数。