【发布时间】:2018-04-25 13:58:21
【问题描述】:
在 ES6 类之前,函数可以用作构造函数:
function MyClass(a, b) {
}
那么,下面的代码就相当于一个经典的实例化(如let thisObj = new MyClass("A", "B")):
let thisObj = Object.create(MyClass.prototype)
// Here we know the `this` object before to call the constructor.
// Then, the constructor is called manually:
MyClass.call(thisObj, "A", "B")
... 这种技术是一种在调用构造函数之前了解this 对象的方法。但是Function.prototype.call() 不适用于 ES6 类构造函数。
对于 ES6,我们有 Reflect.construct():
let thisObj = Reflect.construct(MyClass, "A", "B");
但它没有提供在this对象创建后调用构造函数的方法。
使用 ES6 类仍然可以做到这一点吗?
我的用例
我需要将这个特性从 ES5 保留到 ES6 的框架。该框架负责实例化组件(即 ES6 类)。组件可以从其构造函数创建子组件(在组件树中,这里没有继承)。然后,子组件可以查询框架以从其自己的构造函数中获取其父组件。在这种情况下,我们有一个技术限制,因为框架仍然没有父组件构造函数的返回值。这是与 ES5 相比的回归。
【问题讨论】:
-
出于兴趣,您会将这些知识用于什么目的?
-
@deceze 对于一个框架。该框架负责实例化组件(即 ES6 类)。组件可以从其构造函数创建子组件。然后,子组件可以查询框架以从其自己的构造函数中获取其父组件。在这种情况下,我们有一个技术限制,因为框架仍然没有父组件构造函数的返回值。
-
在调用构造函数之前你对
thisObj做了什么?似乎您的选择将非常有限,因为可以在构造函数中完成很多事情,但它还没有运行。也许您可以考虑让您的框架有一个基类,在子类运行之前初始化this上的所有内容?归根结底,构造函数本身负责决定this是什么,所以如果你还没有调用构造函数,this可以是任何东西。 -
听起来像是一个粗制滥造的框架。如果组件构造函数需要访问父组件,则父组件应作为构造函数参数传递。
标签: javascript class ecmascript-6 constructor this