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

前端之家收集整理的这篇文章主要介绍了JavaScript中可调用对象的构造方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这个问题在这里已经有一个答案:> Can a JavaScript object have a prototype chain,but also be a function?5个
如何在JavaScript中创建可调用对象的构造函数

我尝试过各种方法,如下所示.这个例子只是缩短了实际对象的例子.

function CallablePoint(x,y) {
    function point() {
        // Complex calculations at this point
        return point
    }
    point.x = x
    point.y = y
    return point
}

这首先起作用,但它创建的对象不是CallablePoint的实例,因此它不会从CallablePoint.prototype复制属性,并且在CallablePoint的instanceof上显示为false.是否可以为可调用对象创建工作构造函数

解决方法

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

虽然这只意味着任何具有[[Call]]的东西在构造时只能是函数(好的,有一个例外 – Function.prototype本身不会从Function继承),这并不意味着它不能成为别的东西稍后,同时保留[[Call]]属性.那么,如果您的浏览器不是IE< 11. 允许更改魔法的东西将是ES_中的__proto__,已经在许多浏览器中实现了. __proto__是包含当前原型的魔法属性.通过改变它,我可以使功能从不是功能的东西继承.

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)

首先,CallablePoint的构造函数产生一个函数(只有函数允许以[[Call]]属性开头,接下来我改变它的原型,所以它会继承CallablePoint,此时我有一个不继承的函数功能(有点混乱).

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

这样,CallablePoint实例具有继承链:CallablePoint – >功能 – >对象,仍然可以被调用.另外,由于该对象是可调用的,所以根据该规范,typeof等于“function”.

原文链接:https://www.f2er.com/js/151653.html

猜你在找的JavaScript相关文章