2011-03-31 4 views
3

자바 스크립트의 함수는 객체입니다.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

모든 브라우저에서 작동하는 방법은 없습니다. 게터와 세터는 훌륭하지만, IE6 또는 IE7을 지원해야 할 때 완전히 쓸모가 없습니다.

관련 문제