这个问题在这里已经有一个答案:>
Can a JavaScript object have a prototype chain,but also be a function?5个
如何在JavaScript中创建可调用对象的构造函数?
如何在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”.