3

私は、他の関数から関数を構築するプロジェクトに取り組んでいます。物事を単純化するためにクラスを作成するという考えがありましたが、 を使用せずに動作させることはできませんでした__proto__

これが基本的に私のビジョンです。

function MyFunction () {
    // ...
}
var myFn = new MyFunction();
myFn(); // executes without error
myFn instanceof MyFunction; // returns true

次のコードは、__proto__

function MyFunction () {
    var fn = function () { return 'hello'; };
    fn.__proto__ = this;
    return fn;
}
var myFn = new MyFunction();
alert( myFn() ); // hello
alert( myFn instanceof MyFunction ); // true

これは私が使ってみたものですvalueOf

function MyFunction () {
    this.fn = function () { return 'hello'; };
    this.valueOf = function () { return this.fn; };
}
var myFn = new MyFunction();
alert( myFn instanceof MyFunction ); // true
alert( myFn.valueOf()() ); // hello
alert( myFn() ); // error

のすべてのプロパティを含むように関数を拡張する別の方法を次に示しますMyFunction

function MyFunction () {
    this.foo = 'hello'
    var fn = function () { return 'hello'; };
    for ( var i in this ) {
        fn[ i ] = this[ i ];
    }
    return fn;
}
var myFn = new MyFunction();
alert( myFn() ); // hello
alert( myFn.foo ); // hello
alert( myFn instanceof MyFunction ); // false

__proto__規格外だから使いたくない また、これはちょっと変わったアイデアでした。実際に機能させたいと思っていますが、それが不可能な場合は、私は生きています。しかし、私の質問は、私がやりたいことは可能ですか?

4

1 に答える 1

3

魅力的なアイデア。ES5 を使用していなくても、標準の ECMAScript でそれを実行できるとは思えません。

ES5 では、オブジェクトを作成するときに (コンストラクター関数を経由することなく) プロトタイプを設定する手段を提供するなど、プロトタイプへのアクセスと制御が改善されていますが、そのメカニズムを介して関数Object.createを構築することはできません。は、現在関数によってのみ実装されている抽象仕様メソッドを使用し、その関数実装は、オブジェクトの基になるプロトタイプ ( ) が関数のプロパティにあるかどうかを確認することによって機能するため、これを行う必要があります。オブジェクトの基礎となるプロトタイプを設定する唯一の標準的な方法は、または を介し​​て作成することであり、どちらのメカニズムも関数オブジェクトを作成しません。instanceof[[HasInstance]][[Proto]]===prototypenew MyFunctionObject.create

ES.next はこれを可能にするかもしれません。現在 によって解決されている問題の多くを解決することを意図した、「セット プロトタイプ オペレータ」の「調和」ステータス (つまり、かなり高度な) に昇格された提案があります。その目的の 1 つは、「関数のプロトタイプを別のものに設定する」ことです。それを(現在の形式で)使用すると、次のようになります。<|__proto__Function.prototypeMyFunction

function MyFunction () {
  return MyFunction.prototype <| function () { return 'hello'; };
}
MyFunction.prototype = Object.create(Function.prototype);

最後のビットは、それをMyFunction.prototypeプロトタイプを持つオブジェクトにすることです。そのため、関数は have 、、などFunction.prototypeを介して構築されます。MyFunctioncallapplybind

于 2012-11-05T07:42:12.393 に答える