2012-07-03 2 views
3

В несколько Hacky метод отключения функциональности, я пришел с идеей использовать некоторые JavaScript, как это:Создание объекта Javascript который ничего не делает

//fakefrob.js 
var frob = function() { 
    return { 
     myFunc: function(){}, 
     myFunc1: function(){}, 
     myFunc2: function(){return 2;}, 
     myFunc3: function(){}, 
     myFunc4: function(){} 
    }; 
}(); 

В этом примере реальная Frob имеет реализацию этих функции. Очевидно, что это хак (функции в основном ничего не делают или имеют возвращаемые значения заполнителя). Если я добавлю foobar в realfrob.js, я должен добавить пустую реализацию foobar в fakefrob.js. Есть ли способ (в идеале без использования библиотеки) написать fakefrob.js таким образом, чтобы frob.foobar действовал как foobar, был определен как function(){};, без фактического добавления foobar в fakefrob.js?

ответ

0

Как T.J. Crowder suggests, supported browsers может использовать proxy object для достижения этой цели:

var frob = new Proxy({}, {get: function(){return function(){}}}) 

Как это работает:
Это создает прокси-сервер, который перехватывает все методы получения свойств, заменив результат с пустой функцией. Обычно прокси-объект используется для перехвата и, в конечном счете, перенаправления вызовов на нашу цель (здесь цель {}). Однако этот код слепо возвращает пустую функцию, полностью игнорируя цель.

+0

Обратите внимание, что функция прокси-сервера может принимать исходную цель, если мы хотим генерировать исключения, если имя не существует. – Brian

7

Есть ли способ (в идеале без использования библиотеки) для записи fakefrob.js таким образом, что frob.foobar действует как Foobar был определен как function(){};, фактически не добавляя к Foobar fakefrob.js?

Вы имеете в виду свойство catch-all, отображаемое в функцию no-op? Нет, JavaScript не имеет (в настоящее время) свойств catch-all. (Я считаю, что какой-то механизм для них является рассматривается, как часть прокси материала, сходящего щука на каком-то этапе.)

Если у вас есть доступ к реальному frob в вашем коде, хотя, ваш fakefrob может быть генерируется полностью автоматически:

// Assumes `frob` already exists 
(function() { 
    var mock; 
    var name; 

    // Build the mock, with a function for each function 
    // on the real object. 
    mock = {}; 
    for (name in frob) { 
     if (typeof frob[name] === "function") { 
      mock[name] = function() { }; 
     } 
    } 

    // Replace the original  
    frob = mock; 
})(); 

И, конечно же, если вы хотите, чтобы скопировать свойства без функции, вы можете сделать это в то же время.

Обратите внимание, что я намеренно сделал не включать hasOwnProperty в цикле выше, как я предполагаю, что вы хотите, чтобы ваш макет включать функции, даже если frob наследует их от прототипа.

Если frob наследует некоторые функции и вы хотите ваш макет выставить тот же hasOwnPropety поведение для них, как оригинальный Frob, вы можете получить более творчески:

// Assumes `frob` already exists 
(function() { 
    var mock; 
    var mockProto; 
    var name; 

    function FakeFrob() { 
    } 

    mockProto = FakeFrob.prototype; 

    // Build the mock, with a function for each function 
    // on the real object. 
    mock = new FakeFrob(); 
    for (name in frob) { 
     if (typeof frob[name] === "function") { 
      if (frob.hasOwnProperty(name)) { 
       mock[name] = function() { }; 
      } 
      else { 
       mockProto[name] = function() { }; 
      } 
     } 
    } 

    // Replace the original  
    frob = mock; 
})(); 

Теперь, если первоначальный frob был свой foo (frob.hasOwnProperty("foo") - true), но унаследованный bar (frob.hasOwnProperty("bar") - false), hasOwnProperty на ваш макет скажет точно такую ​​же вещь.

+0

'if (typeof realFrob [name] ===" function ") {' i think should be 'if (typeof realFrob [name]! ==" function ") {' right, потому что realFrob [name] не существовать? –

+0

@TrinhHoangNhu: Цель цикла - создавать свойства на 'mock' с теми же именами, что и свойства на realFrob, которые ссылаются на функции, поэтому' === ', а не'! == '. –

+0

О, спасибо: D ... –

Смежные вопросы