2013-10-09 5 views
3

예를 들어, YUI3에서 메소드를 덮어 쓸 수 있습니다. Node 모듈?YUI 모듈의 원숭이 패치 방법을 사용할 수 있습니까?

Y.Node.prototype.get = function() { 
    // Do some stuff then call the original function 
}; 

(당신이 기대하는 것처럼) Y 내가 도서관에 의해 만들어진 가정 YUI의 세계적 인스턴스를 사용할 수있을 때 완벽하게 작동합니다 : 예를 들어,이 같은 일을하고 싶다. 그것은 당신이 모듈 로더를 사용할 때 작동 및 콜백 통과하지 : 나는 유이 소스를 통해 파고 동안을 보낸 적이 있지만 지금까지 어디에서 앞의 예에서 DifferentY가 얼마나 해결하지 못한

YUI().use("*", function (DifferentY) { 
    DifferentY.Node.prototype.get === Y.Node.prototype.get; // false 
}); 

을 생성되고 (확장에 따라 DifferentY.Node이 생성됩니다).

전에 완전히 YUI를 사용한 적이 없으므로 완전히 잘못된 방식으로이 문제를 해결할 수 있습니다.

답변

5

Ok 그 예를 보면 Y에 대한 오해가있는 것처럼 보입니다. YUI3에서는 모든 것이 샌드 박싱되어 있기 때문에 여러 개의 YUI 인스턴스를 동시에 실행할 수 있습니다. Y는 전역 변수가 아니며 YUI(). use 메소드를 호출 할 때 인스턴스화되며 해당 함수 내에 만 존재합니다. 그 이유는 SO에만 DifferentY 존재의 코드에서,하지만 당신은 내가 YUI의 모듈 전략을 구축하고 YUI.add와 YUI 모듈을 만들 것입니다 "외부에서"YUI를 강화하려는 경우하지 (그래서

YUI().use('node', 'event', function (Y) { 
    // The Node and Event modules are loaded and ready to use. 
    // Y exists in here... 
}); 

를 Y로)

if (YUI) { 
    YUI.add('node-enhancement', function (Y) { 
    Y.Node.prototype.get = function() { 
     // Do some stuff then call the original function 
    }; 
    }, '0.0.1', { 
    requires: [Node] 
    }); 
} 

와 개발자가 자신이 글로벌 YUI 객체가 어떻게 작동하는지에 대한 설명) yui3으로 어쨌든

YUI().use('node-enhancement'), function(Y) { 
    // just use YUI as allways 
}); 

그것을 할 것입니다 방법 (모듈로 강화를로드하자,이 개요는 그러는 수 p : http://yuilibrary.com/yui/docs/yui/

+0

감사를 사용하는 것이 편리하다. 혼란스러운 점은'use' 콜백 밖에서'YUI'의 인스턴스가 사용 가능하다는 것입니다. http://jsfiddle.net/whMhq/ –

+0

@JamesAllardice YUI 객체는 전역 적입니다 (객체와 함수 모두입니다). YUI의 각 인스턴스는 .use 문의 마지막 매개 변수 인 함수에 전달 된 Y 변수에 할당됩니다. Y 인스턴스는 .use 호출에서 지정한 모듈에만 할당됩니다. – PottyBert

+0

@Kris - 나는 YUI의 인스턴스처럼 보이는 'Y' 오브젝트가 전 세계적으로 사용 가능하다. 'use' 호출을 사용한다면 어디에서 온 것이고 무엇이 중요한가? –

0

다음은 원숭이 패치 기법의 사용 예입니다. 여기에 콘솔 출력 밖으로

확인 : YUI.GlobalConfig를 사용하는 http://jsfiddle.net/jslayer/XmF6L/

YUI.add('node-custom-module', function(Y){ 
    console.warn('Override Y.Node'); 

    Y.Node.YOUR_NODE = 'custom Node'; 
}); 

YUI.add('widget-custom-module', function(Y){ 
    console.warn('Override Y.Widget'); 

    Y.Widget.YOUR_WIDGET = 'custom Widget'; 
}); 

YUI.GlobalConfig = { 
    modules : { 
     'node-custom-module' : { 
      condition : { 
       name : 'node-custom-module', 
       trigger : 'node', 
       test : function(){ 
        return true; 
       } 
      } 
     }, 
     'widget-custom-module' : { 
      condition : { 
       name : 'widget-custom-module', 
       trigger : 'widget', 
       test : function(){ 
        return true; 
       } 
      } 
     } 
    } 
}; 

YUI().use('node', function(Y) { 
    console.group('Node'); 
    console.log('Y.Node.YOUR_NODE : ', Y.Node.YOUR_NODE); 
    console.groupEnd('Node'); 
}); 

YUI().use('widget', function(Y) { 
    console.group('Widget'); 
    console.log('Y.Node.YOUR_NODE : ', Y.Node.YOUR_NODE); 
    console.log('Y.Widget.YOUR_WIDGET : ', Y.Widget.YOUR_WIDGET); 
    console.groupEnd('Widget'); 
}); 

는 반드시 그럴 필요는 없습니다.

또한,이 확실히 의미가, groups (http://yuilibrary.com/yui/docs/yui/loader.html) YUI 내부 설정의

groups : { 
    patches : { 
    modules : { 
     /* Define your mp modules here */ 
    } 
    } 
}