JavaScript 객체의 프로토 타입을 숨길 수 있습니까?이 뒤에있는 신비는 무엇입니까?
-
21-12-2019 - |
문제
OpenUI5를 사용하고 있습니다.UI 컨트롤 버튼을위한 생성자 함수가 있으며 버튼의 프로토 타입 속성을 볼 수는 없지만 브라우저 콘솔에서 실행될 때 동일한 작업이 표시됩니다!
sap.m.Button.prototype.Move = function(){
console.log('Move');
}
var oButton = new sap.m.Button({text:"Hello"});
oButton.Move(); // throws undefined function!
.
콘솔에서 브라우저를 실행할 때 동일한 코드가 작동합니다!
해결책
코드를 실행 한 후 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 구성 파일이 이러한 사용되지 않는 컨트롤에 대해로드되지 않은 경우 게으른로드 컨트롤에 대한이 작업이 수행됩니다. 그것은 몇 가지 단점이 있습니다.
- 프로토 타입을 설정하기 전에 먼저 인스턴스를 만들어야합니다.
- Config 파일은 동기식으로로드되므로 느린 연결을 사용하여 많은 컨트롤의 첫 번째 인스턴스를 만들 때 앱이 응답하지 않게됩니다.
공장 기능을위한 더 나은 방법은 약속을 반환 할 수 있으므로 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
이 답변이 콘솔에서 실행할 때 해당 프로토 타입으로 멈추는 것이 완료되었지만, 테스트에서 프로토 타입에 추가 한 다음 처음으로 버튼을 만들었습니다 (프로토 타입을 다시 변경합니다). 그런 다음 더 이상 거기없는 당신의 오래된 것을 부르려고합니다.