実際は可能です。ファンクションが作成されると、function
構文またはFunction
コンストラクタのいずれかを使用して、内部の[[Call]]
プロパティが取得されます。それは関数自体のプロパティではなく、構築されたときに関数が取得するプロパティです。それは後で何か他のものになることができないという意味ではありません
ことが唯一の[[Call]]
を使って何がそれが構築されていますのみFunction
ときかもしれないことを意味しますが(まあ、Function
から継承しない唯一の例外– Function.prototype
自体があります)、 [[Call]]
プロパティを保持しています。あなたのブラウザがIEでない場合< 11.
魔法を変えることができるものは、すでに多くのブラウザで実装されているES6の__proto__
です。 __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)
まず、CallablePoint
のコンストラクタはなりFunction
(のみFunction
sが、私は、そのプロトタイプを変更[[Call]]
プロパティ。次で始まるが許可されているので、それはCallablePoint
を継承します。この時点で私はdoesnの機能を持っています「tはFunction
(混乱の一種)を継承しています。
私はCallablePoint
秒のコンストラクタを定義した後、私はFunction
へCallablePoint
のプロトタイプを設定するので、私はFunction
から継承CallablePoint
を持っている。
このようにして、CallablePoint
インスタンスのプロトタイプチェーンはCallablePoint -> Function -> Object
ですが、依然として呼び出し可能です。また、オブジェクトは呼び出し可能であるため、仕様に従って、typeof
は'function'
になります。
あなたは 'function point(){return point}'が関数自体を返すだけであることは知っていますか?あなたはこれで何をしようとしていますか? 'p()()()()()()()()()'を実行することができますが、そのポイントは何ですか? (意図された馬小屋)。 –
@FelixKling分かりやすく私はこの質問に答えることを拒否しなければならなかった – Pointy
完全性のために、ES6はもっと良い解決策を持っています。http://stackoverflow.com/questions/36871299/how-to-extend-function-with -es6-classes – 0xc0de