Можно ли скрыть прототип объекта JavaScript!Что такое тайна за этим?

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

Вопрос

Я использую OpenUI5.Существует функция конструктора для кнопки управления пользовательскими интерфейсами, неспособна видеть свойства прототипа кнопки, но одинаково, когда выполняется в консоли браузера, отображается!

 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

Это было полезно?

Решение

После запуска кода я обнаружил, что создание первого экземпляра SAP.M.Button вызывает сценарий для изменения прототипа SAP.M.Button. Это действительно в JavaScript, но не очень умным, если вы спросите меня.

Первое создание вызывает синхронный запрос (нет тоже нет), чтобы получить библиотеки-параметры .json.

Если вы запускаете код во второй раз, у него будет прототип. 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
.

Я думаю, что это сделано для ленивых управлений нагрузки, если кнопка никогда не создается, то файлы Config json никогда не загружаются для этих неиспользованных элементов управления. Он имеет пару недостатков, хотя.

  1. Вы должны сначала создать экземпляр, прежде чем вы сможете установить прототип.
  2. Файлы конфигурации синхронно загружаются, поэтому при создании первого экземпляра многих элементов управления с медленным соединением приведет к невозможности не реагировать.
  3. Лучший способ быть для фабричной функции, чтобы вернуть обещание, чтобы создать контроль так же каждый раз, и файлы конфигурации могут быть получены асинхронно.

    [Обновление]

    Смотреть на конфиг, кажется, конфигурация для всей библиотеки GUI, поэтому я не вижу причину, по которой это загружено только после создания первого экземпляра. Библиотека, которая меняет свои определения объекта при создании экземпляров не очень легко расширяться, потому что она непредсказуема. Если он меняет только прототип на первое творение, то должно быть хорошо, но похоже, что создатели библиотеки не хотели, чтобы люди продлили его, или они не сделают определение объекта непредсказуемым. Если доступна документация 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();
.

Это не скрывает прототип сами по себе. Если функция конструктора выходит нормально, вы получаете прототип этой функции. Но, если функция конструктора на самом деле возвращает какой-то другой объект, вы получаете этот прототип другого объекта, поэтому недействительно предположить, что только потому, что вы добавили в прототип кнопки, что при вызове новой кнопки (), что вы увидите ваш метод на что Вы вернетесь. Я уверен, что если вы определите, что этот код вы обнаружите, что конструктор, который вы звоните, имеет «возврат нового uverotherinstanceOfButton ()» или аналогично в конце этого.

Редактировать: Хорошо, немного сложно посмотреть, что на самом деле происходит в этом коде SAP, но, похоже, у них есть код, который перезаписывает прототипы элементов управления, чтобы добавить их функции, такие как: SAP.UI.CORE.ENALDPROPAGATOR И эти вещи не бегают, пока вы на самом деле не создаете кнопку. Поэтому, если вы измените свой код, чтобы создать кнопку на странице, затем добавьте его прототип, затем постройте и вызовите метод, он работает нормально. Как так:

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

Итак, я думаю, что мой ответ, когда вы запускаете его из консоли, он закончил с этим прототипом, тогда как в вашем тесте вы добавляли в прототип, затем настроив кнопку в первый раз (который снова меняет прототип) Затем пытаясь позвонить своему старуху, который больше нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top