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!
.
コンソールで実行されたブラウザが機能するときに同じコードが機能します!
jsbin - > http://jsbin.com/tepum/1/editud/A>
解決
コードを実行した後、SAP.M.Buttonの最初のインスタンスを作成すると、SAP.M.Buttonのプロトタイプを変更するようにします。それはJavaScriptで有効ですが、あなたが私に尋ねても非常に賢くない。
最初の作成により、ライブラリ-partations.jsonを取得するための同期要求(なし)を引き起こします。
コードを実行すると、Prototype.MOVEがある場合は、ボタンのインスタンスを作成するためButton.Prototypeは変更されません。
移動中の資本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ファイルはこれらの未使用のコントロールにはロードされません。それはいくつかの欠点を持っています。
- プロトタイプを設定する前に、最初にインスタンスを作成する必要があります。
- 設定ファイルは同期的にロードされているので、遅い接続を伴う多くのコントロールの最初のインスタンスを作成すると、アプリが応答しないようになります。
より良い方法では、工場機能が約束を返すようにするため、毎回コントロールを作成し、設定ファイルを非同期的にフェッチできるようにするためです。
[更新]
Configを見て、GUIライブラリ全体の設定のようですので、最初のインスタンスを作成した後にのみロードされた理由はわかりません。インスタンスを作成するときにオブジェクト定義を変更するライブラリは、予測できないために拡張するのが非常に簡単ではありません。最初の作成時にプロトタイプを変更した場合、それは大丈夫であるべきですが、ライブラリのメーカーは人々がそれを拡張したくないように見えます。利用可能なAPIドキュメントがある場合は、それを確認してみてください。
[更新]
コントロールを拡張するのは、 EXTEND
他のヒント
@ 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();
. プロトタイプ自体を隠していない。コンストラクタ関数が正常に終了すると、その機能のプロトタイプが表示されます。ただし、コンストラクター機能が実際に他のオブジェクトを返す場合は、その他のオブジェクトのプロトタイプを取得するため、New Button()を呼び出すときにボタンプロトタイプに追加したからといってください。戻ってきます。あなたが呼び出しているコンストラクタがその終わりに「リターン」またはその最後に似ているように、そのコードを難読化していることを確実にしています。
編集:OKそのSAPコードで本当に起こっているのかを確認するのは少し難しいですが、コントロールのプロトタイプを上書きするコードがあるように見えます.SAP.UI.CORE.EnabledPropagatorあなたが実際にボタンをインスタンス化するまで、それらのことは実行されません。そのため、ページ上のボタンをインスタンス化するようにコードを変更してから、それ以降のプロトタイプに追加してから、メソッドを作成して呼び出してください。そのように:
http://jsbin.com/benajuko/2/edit
だから私の答えは、コンソールから実行すると、そのプロトタイプでマッキングが終わったのは、テストではプロトタイプに追加してから、初めてボタンを作成しています(プロトタイプを再度変更する)。それからあなたの古いものを呼び合おうとしています、それはもうそこではありません。