JavaScript 객체의 프로토 타입을 숨길 수 있습니까?이 뒤에있는 신비는 무엇입니까?

StackOverflow https://stackoverflow.com//questions/23005462

문제

OpenUI5를 사용하고 있습니다.UI 컨트롤 버튼을위한 생성자 함수가 있으며 버튼의 프로토 타입 속성을 볼 수는 없지만 브라우저 콘솔에서 실행될 때 동일한 작업이 표시됩니다!

 sap.m.Button.prototype.Move = function(){
  console.log('Move');
} 
var oButton = new sap.m.Button({text:"Hello"});
oButton.Move(); // throws undefined function! 
.

콘솔에서 브라우저를 실행할 때 동일한 코드가 작동합니다!

jsbin -> http://jsbin.com/tepum/1/edit kn/tepum/1/edit.a>

도움이 되었습니까?

해결책

코드를 실행 한 후 SAP.m.Button의 첫 번째 인스턴스를 만드는 것은 스크립트가 SAP.m.Button의 프로토 타입을 변경합니다. JavaScript에서 유효하지만 나에게 묻는다면별로 똑똑하지는 않습니다.

첫 번째 작성은 라이브러리 매개 변수를 가져 오는 동기 요청 (아니오도 아니요)을 일으 킵니다.

코드를 실행하면 두 번째 버튼의 인스턴스를 만들 수 없으므로 prototype.move가 있습니다.

이동중인 자본 M은 생성자 기능을 제안 할 것이므로 조언을 소문자로 변경합니다.

매개 변수를 가져 오기 때문에 동기식이므로 첫 번째 인스턴스를 만들고 프로토 타입을 설정할 수 있습니다.

console.log("First Button creation changes Button.prototype");
var oButton = new sap.m.Button({text:"Hello"});
sap.m.Button.prototype.move = function(){
  console.log('Move');
} 
oButton.placeAt('content');
oButton.move(); // logs Move
.

내 추측은 버튼이 작성되지 않은 경우 JSON 구성 파일이 이러한 사용되지 않는 컨트롤에 대해로드되지 않은 경우 게으른로드 컨트롤에 대한이 작업이 수행됩니다. 그것은 몇 가지 단점이 있습니다.

  1. 프로토 타입을 설정하기 전에 먼저 인스턴스를 만들어야합니다.
  2. Config 파일은 동기식으로로드되므로 느린 연결을 사용하여 많은 컨트롤의 첫 번째 인스턴스를 만들 때 앱이 응답하지 않게됩니다.
  3. 공장 기능을위한 더 나은 방법은 약속을 반환 할 수 있으므로 Conform 파일을 비동기 적으로 가져올 수 있고 동일한 방식으로 제어를 만들 수 있습니다.

    [업데이트]

    구성을보고 전체 GUI 라이브러리에 맞게 구성 인 것으로 보이므로 첫 번째 인스턴스를 생성 한 후에 만로드되는 이유가 표시되지 않습니다. 인스턴스를 작성할 때 오브젝트 정의를 변경하는 라이브러리는 예측할 수 없으므로 확장하기가 쉽지 않습니다. 첫 번째 생성시 프로토 타입 만 변경하면 괜찮을 것입니다. 그러나 라이브러리의 제조자가 사람들이 그것을 확장하거나 객체 정의를 예측할 수 없게하는 것처럼 보입니다. API 문서가있는 경우 API 문서가있는 경우 해당 확인을 시도하십시오.

    [업데이트]

    컨트롤을 확장하는 "올바른"방법은 확장 .

다른 팁

@hmr ui5 관리되는 객체가 제공하는 확장 기능을 사용하여 컨트롤을 확장하는 올바른 방법입니다. http://jsbin.com/linob/1/edit

아래의 예에서 다른 사람들이 멘토닝으로 디버깅 할 때 아래에서는 제어가 필요할 때로드되는 컨트롤이 게으르게되면

를로드 할 때 이전에 변경 사항이 끊어졌습니다.
    jQuery.sap.declare("my.Button");
    jQuery.sap.require("sap.m.Button");
    sap.m.Button.extend("my.Button", {
        renderer: {} 
    });

    my.Button.prototype.Move = function() {
        console.log('Move');
    };

    var oButton = new my.Button({
        text: "Hello"
    });
    oButton.placeAt('content');
    oButton.Move();
.

프로토 타입 자체를 숨기지는 않습니다. 생성자 함수가 정상적으로 종료되면 해당 함수의 프로토 타입을 얻습니다. 그러나 생성자 함수가 실제로 다른 객체를 반환하면 다른 객체의 프로토 타입을 얻으므로 새 버튼을 호출 할 때 메서드를 볼 때 버튼 프로토 타입을 추가 했으므로 유효하지 않습니다. 너는 돌아왔다. 전화를 걸고있는 생성자가 "Return SubsotherInstanceOfButton ()"또는 이와 유사한 것을 알 수 있습니다.

편집 : OK SAP 코드에서 실제로 진행되는 것을 보는 것은 조금 어렵지만, 컨트롤의 프로토 타입을 덮어 쓰는 코드가있는 것처럼 보입니다. sap.ui.core.enabledPropagator 그리고 실제로 버튼을 인스턴스화 할 때까지 실행되지 않습니다. 따라서 페이지에서 버튼을 인스턴스화하도록 코드를 변경 한 다음 프로토 타입에 추가 한 다음 메소드를 구축하고 호출하면 잘 작동합니다. 그렇게 그렇게 :

http://jsbin.com/benajuko/2/edit

이 답변이 콘솔에서 실행할 때 해당 프로토 타입으로 멈추는 것이 완료되었지만, 테스트에서 프로토 타입에 추가 한 다음 처음으로 버튼을 만들었습니다 (프로토 타입을 다시 변경합니다). 그런 다음 더 이상 거기없는 당신의 오래된 것을 부르려고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top