5

ほとんどの人は、次のコード スニペットを見たことがあると思います。

Function.prototype.method = function (name, func) {
  this.prototype[name] = func;
  return this;
};

また、「メソッド」という名前のメソッドにアクセスできるように関数によって作成されたすべてのオブジェクトであるため、すべての関数に影響することも知っていますが、関数自体も次のように「メソッド」にアクセスできる理由がわかりません。

Function.method('test', function () {return 1;});
4

4 に答える 4

7

Edorka の答えは正しいです。関数は独自のコンストラクター (つまり、「親」) です。

Function.constructor;  // function Function() { [native code] }

通常、あなたがしていることはできません。たとえば、これは機能しません。

f = function () {};
f.prototype.a = 5;
f.a;  // undefined

この種のことは、次のように関数をコンストラクターとして使用する場合にのみ機能します。

f = function () {};
f.prototype.a = 5;
g = new f();
g.a;  // 5

しかし、関数は奇妙です。それはすべての関数のコンストラクタであり、関数自体でもあるため、独自のプロトタイプからプロパティをテンプレート化します。したがって、コードを呼び出すことができFunction.method()ます。

于 2013-07-03T11:33:35.827 に答える
5

Functionそれ自体が関数であるため:

typeof Function === 'function'
Object.getPrototypeOf(Function) === Function.prototype

evalそして、関数 ( indirect の形式)として呼び出されていることがわかります。

Function('return 1+2')() === 3

spec で定義されているすべてのこと。

上記のコメントで zerkms が尋ねた:

Function オブジェクトと Function プロトタイプのどちらが先ですか?

貧弱なプログラマーである私たちに公開されているものは、内部で表現されているものとは異なることを理解する必要があります。これは、コンストラクターをオーバーライドすることで例示できますArray(ヒント: 回答を書いている間はこれを試さないでください。多くのエラーが発生します)。

new Array(0, 1, 2); //gives you [0, 1, 2]
Array = function () { return [4] };
new Array(0, 1, 2); //gives you [4]
//however,
[0, 1, 2] //will always give you [0, 1, 2]

これは、仕様のセクション(「セマンティクス」セクションの少し下) によるものです。

配列を、式new Array()whereArrayがその名前の標準組み込みコンストラクターであるかのように、新しいオブジェクトを作成した結果とします。

配列リテラル (または仕様で呼び出される配列初期化子) を使用すると、組み込みのArray コンストラクターを確実に使用できます。

なぜこの例を挙げたのですか?まず第一に、それは楽しい例だからです。第二に、私たちが行っていることと実際に行われていることがどのように異なるかを示すことです。zerkms に答えるために、Function オブジェクトが最初に来た可能性が最も高いですが、それは最初の関数ではありませんでした。その組み込み関数にはアクセスできません。

于 2013-07-03T11:32:56.767 に答える
1

次のコンストラクター関数オブジェクトを検討してください。

var Construct = function () { };

プロトタイプの共有関数:

Construct.prototype.hello = function (name) { console.log("Hello " + name); };

コンストラクターからオブジェクトを作成するnewと、共有メンバー関数が取得されます。

var c = new Construct();
c.hello("World");

cと同じinstanceof Construct Object、また任意

  • functioninstanceof Functionありinstanceof Object
  • Functionそれ自体はinstanceof FunctionおよびObject
  • Constructでありinstanceof Function Object、また
  • Objectですinstanceof Function Object

すべてfunctionのステートメントと演算子は、ネイティブのリテラルですnew Function
すべて{ }のリテラルはネイティブnew Objectです。

newによって作成されたオブジェクトはconstructor、 のメンバーを取得しconstructor.prototypeます。
オブジェクトはそれ自体の任意のメンバーを持つことができ、プロトタイプのメンバーのみが共有されます。

于 2013-07-03T11:29:37.740 に答える
1

新しい関数は Function のプロトタイプを使用しているため、Functions メソッドも独自のプロトタイプ メソッドを使用しています。

このメソッドまたは属性の 1 つを変更し、それが「親」プロトタイプに属していた場合、このプロトタイプを使用する他のすべてのオブジェクトが影響を受けます。

この奇妙な主題に関連するリテラシー: http://www.packtpub.com/article/using-prototype-property-in-javascript

于 2013-07-03T11:09:02.590 に答える