2012-02-24 4 views
3

javascriptで独自の関数実装を行うことは可能ですか? __invokeの魔法の方法でPHPオブジェクトのようなjavascriptオブジェクトを持っているには?javascript Functionオブジェクトから継承することはできますか?

A = function(){}; 
    A.prototype = new Function(); 

    var a = new A(); 
    alert(a instanceof Function); // true 
    a(); // exception 

自分の質問に答えることはできません...そこの答えである:everebodyため

申し訳ありませんが、私は投稿時に(私は離れて答えから、いくつかの段階にあった私の仕事のための良い方法を発見しました質問)。私は質問を削除しない、誰かが私より少ない時間を過ごすことを願っています。

これは初心者の質問ですが、私に電子メールを送信して削除します。ありがとうございました!

+0

何のために:あなたは、もちろん、このパターンを簡略化することができ

?単純に 'a'を必要な振る舞いの関数にすることで欠けているものは何ですか? – davin

+0

Read this http://www.crockford.com/javascript/inheritance.html –

+0

@LeoあなたのソリューションはIEで動作しません。そのブラウザは '__proto__'を実装していないからです。また、 '__proto__'は非標準であり、**非難されているので、おそらくそれに頼るのは良い考えではないことに注意してください。 –

答えて

0

いいですか?残念ながらそれを行う良い方法はありません。

この問題は、関数をコンストラクタ関数のprototypeとして設定し、newを指定してコンストラクタ関数を呼び出すと、呼び出し可能な関数オブジェクトではなく、普通の古いオブジェクトが生成されるという問題があります。

これに必要なものに応じて、可能なセミ・ワークアラウンドが1つあります。それは面白いトリックですが、実際にはのためにははお勧めできません。 iframeを作成し、iframeのウィンドウからFunctionを取得することができます。今度はFunctionの "コピー"を持っています。あなたの "本当の" Function機能を汚さずに何でもできます。

var frame = document.createElement('iframe'); 
frame.id = frame.name = 'hacks'; 
frame.style.zIndex = '-1'; 
document.appendChild(frame); 
var MyFunction = frames['hacks'].Function; 
// add stuff to MyFunction and MyFunction.prototype 
0

これはどう:

function MyFunction (f) { 
    _.extend(f, MyFunction.prototype); 
    return f; 
}; 

MyFunction.prototype.method = function() { 
    alert('method called'); 
}; 

var func = MyFunction(function() { 
    alert('function called'); 
}); 

ライブデモ:

var func = MyFunction(function() {...}); 
http://jsfiddle.net/nZczW/

だから、あなたはあなたのカスタム関数のコンストラクタに渡すことで、カスタム関数を作成

メソッドは(通常)コンストラクタのプロトタイプに:コンストラクタの内部

MyFunction.prototype.foo = function() {...}; 

、方法は、関数自体に直接割り当てられています。 (私はunderscore.jsの_.extend()を使用しました)。したがって、あなたの関数はまだFunction.prototypeから直接継承します。

var methods = { /* hash of methods */ }; 

var func = _.extend(function() { ... }, methods); 
関連する問題