2011-09-02 4 views
8

私は今、いくつかの新しい領域に入っています。私はしばらくこのようなことをしていません。関数を拡張する - 2つの関数をマージしますか?

例えばJavascriptの「クラス」を持つための最良の方法は何ですか

// In the parent instance 
function xyz() 
{ 
    var x = 1; 
} 

私はクラスでこれを設定すると、ユーザーはクラスを拡張するとき、私は彼らがこれを効果的に拡張することにしたいです関数。私は私がはっきりしていないことを知っていますが、それは長い一日です。これは、例えばユーザのコードです。生じるはずであるマージ

// In the child instance 
function xyz() 
{ 
    var y = 2; 
} 

// In the merged instance 
function xyz() 
{ 
    var x = 1; 
    var y = 2; 
} 

は私が間違っているものを吸ったり、間違った質問をしているだろうか?

+2

同じものを喫煙し続けてください:) – JoeyC

答えて

8

ここで説明したように関数をマージすることはできませんが、できることは、それ自体と新しい関数(元の前後)を呼び出すように再定義することです。

var xyz = function(){ 
    console.log('xyz'); 
}; 

var abc = function(){ 
    console.log('abc'); 
}; 

// and, elsewhere, if you want to merge: 
var orig = abc; 
abc = function(){ 
    orig.call(this, arguments); 
    xyz.call(this, arguments); 
}; 
実行コンテキストを気にしない場合、または呼び出された関数がパラメータなしの場合は、(this、arguments)を含める必要はありません。しかし、パラメータ化されたメソッドを必要とする場合は、何をするかを明確にするために私は含めました。

8

jqueryで質問にタグを付けるので、jqueryを使用すると仮定します。 jqueryを使用すると、オブジェクトをjQuery.extend()にマージできます。

var object1 = { 
    apple: 0, 
    banana: {weight: 52, price: 100}, 
    cherry: 97 
}; 
var object2 = { 
    banana: {price: 200}, 
    durian: 100 
}; 

/* merge object2 into object1 */ 
$.extend(object1, object2); 

または継承を実装するためにプロトタイプチェーンを使用します。例えば:

function a() { 
    this.t1 = 1; 
    this.sayMyName = function() { 
     alert('a'); 
    } 
} 
b.prototype = new a; 
b.prototype.constructor = b; 
function b() { 
    this.t2 = 2; 
    this.sayMyName = function() { 
     alert('b'); 
    } 
} 
var obj = new b(); 
alert(obj.t1); // this would say 1 
obj.sayMyName(); // this would say b 
+0

プロトタイプチェーンは私が興味を持っているものです。プロトタイピングについては素早く読みましたが、機能には入りませんでした。あなたはこれについての良い読書を知っていますか? –

+0

javascriptでクラス/継承を実装する方法は複数あります。ここにオブジェクト指向のjavascriptに関するいくつかの記事です。 [JavaScriptクラスを定義する3つの方法](http://www.phpied.com/3-ways-to-define-a-javascript-class/)[JavaScriptによるオブジェクト指向プログラミング](http://mckoss.com /jscript/object.htm)[JavaScriptの古典的継承](http://www.crockford.com/javascript/inheritance.html)はこの助けを望んでいます:) – ntangjee

0

私が正しくあなたを理解していれば、あなたは元の関数の名前を変更し、新しい機能の中でそれを呼び出す試すことができます。

MyClass.prototype.old_xyz = MyClass.prototype.xyz; 
MyClass.prototype.xyz = function() { 
    this.old_xyz(); 
} 

// In the parent instance 
function xyz() 
{ 
    var x = 1; 
} 

// In the child instance 
var old_xyz = xyz; 
function xyz() 
{ 
    var y = 2; 
    old_xyz(); 
} 

また、クラス/メソッドの継承と連携

関連する問題