私が使用しバンディの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を使用し、選択時に呼び出されるメソッドをオーバーライドすることで回避できます。これをプラグ可能にするために探しているものです。
私は名前でプロパティをフックすることしかできません。すべてを元のオブジェクトに委譲する必要があります – bcoughlan