2011-03-31 4 views
3

関数はオブジェクトです:Javascript、オブジェクトの属性が変更されたときのコールバック? JavaScriptで

var x = function(){}; 
x.y = 1; 
console.log(x.y); //Prints 1 

は、yが変化したときに関数を呼び出す方法はありますか?

これを行う理由は、パフォーマンスをベンチマークできるようにjqueryの "$"関数をオーバーライドしようとしているからです。 JSが$('mySelector')を実行してもうまく動作します。ただし、$.fn.myPluginを使用して作成されたプラグインは、元のオブジェクトではなく、上書きしたオブジェクトの属性を変更します。

答えて

0

私が使用しバンディのdefineGetterの提案に落ち着いたが、の属性によってループのアプローチを元のオブジェクト

getAttr = function(att) { 
    return function() { return eval("originalObject."+att) }; 
} 
//Delegate all attribute access to original object 
for (var att in originalObject) { 
    overRiddenObject.__defineGetter__(att.toString(), getAttr(att)); 
} 

そして、ここで私はjQueryのセレクタをプロファイルする私のコードに固執することができ、完全な抜粋です:

var original$ = $; 
$ = function() { 
    //Ignore document.ready function calls 
    if (typeof(arguments)[0] === 'function') { 
     return original$.apply(this, arguments); 
    } 

    t1 = new Date().getTime(); 
    // Run each selector 100 times since we can only time it to the millisecond 
    for (var i=0; i<100; i++) 
     x = original$.apply(this, arguments); 
    t = new Date().getTime()-t1; 
    // Print selector name, time taken and number of elements matched 
    console.log(arguments," "+t+"ms"+" ("+x.length+" element(s))"); 
    return x; 
}; 
getAttr = function(att) { 
    return function() { return eval("original$."+att) }; 
} 
//Delegate all attribute access to original object 
for (var att in original$) { 
    $.__defineGetter__(att.toString(), getAttr(att)); 
} 

これはおそらく、閉鎖のを使用して、より良いスタイルで行うことができるが、それは動作します。

また、(function($) {...))(jQUery)から "$"を削除すると、jQueryプラグインでのみ機能します。

これは、これを書き換えて.extendを使用し、選択時に呼び出されるメソッドをオーバーライドすることで回避できます。これをプラグ可能にするために探しているものです。

1

私はあなたが探していると信じていますJavaScript settersです。厳しいブラウザサポートを勉強するように注意してください。

次の例は、MDNのドキュメントに記載されています。まず、あなたがあなた自身のオブジェクトを作成します。既存のプロトタイプを強化

var o = {a: 7, 
     get b() {return this.a + 1;}, 
     set c(x) {this.a = x/2}}; 

第二に、:

var d = Date.prototype; 
d.__defineGetter__("year", function() { return this.getFullYear(); }); 
d.__defineSetter__("year", function(y) { this.setFullYear(y); }); 
+0

私は名前でプロパティをフックすることしかできません。すべてを元のオブジェクトに委譲する必要があります – bcoughlan

1

これはすべてのブラウザで機能する方法はありません。 Gettersとsetterは素晴らしいですが、IE6やIE7をサポートする必要があるときは、まったく役に立たないです。

関連する問題