JavaScript中可调用对象的构造方法

Kon*_*ski 11 javascript constructor callable

如何在JavaScript中为可调用对象创建构造函数?

我尝试了各种各样的方式,比如跟随.这个例子只是缩短了实际对象的例子.

function CallablePoint(x, y) {
    function point() {
        // Complex calculations at this point
        return point
    }
    point.x = x
    point.y = y
    return point
}
Run Code Online (Sandbox Code Playgroud)

这工作在第一,但它创建的对象不是实例CallablePoint,因此它不会从复制的属性CallablePoint.prototype,并说falseinstanceof CallablePoint.是否可以为可调用对象创建工作构造函数?

Kon*_*ski 21

原来它实际上是可能的.通过使用function语法或Function构造函数创建函数时,它将获得内部函数[[Call]]属性.它不是函数本身的属性,而是任何函数在构造时获得的属性.

虽然这只意味着任何东西都[[Call]]可能只有Function在构造时(好吧,有一个例外 - Function.prototype本身不会继承Function),这并不意味着它在以后保留[[Call]]属性时不会成为别的东西.好吧,如果您的浏览器不是IE <11.

允许改变魔法的东西__proto__来自ES6,已在许多浏览器中实现.__proto__是一个神奇的属性,包含当前的原型.通过改变它,我可以创造继承自非事物的功能Function.

function CallablePoint(x, y) {
    function point() {
        // Complex calculations at this point
        return point
    }
    point.__proto__ = CallablePoint.prototype
    point.x = x
    point.y = y
    return point
}
// CallablePoint should inherit from Function, just so you could use
// various function methods. This is not a requirement, but it's
// useful.
CallablePoint.prototype = Object.create(Function.prototype)
Run Code Online (Sandbox Code Playgroud)

首先,构造函数用于CallablePoint创建Function(只Function允许s以[[Call]]属性开头.接下来,我更改其原型,因此它将继承CallablePoint.此时我有一个不继承的函数Function(有点混乱).

在我为CallablePoints 定义构造函数之后,我将原型设置为CallablePointto Function,所以我CallablePoint继承了它Function.

这样,CallablePoint实例具有原型链:CallablePoint -> Function -> Object,同时仍然可以调用.另外,因为对象是可调用的,所以根据规范,它typeof等于'function'.