2016-01-25 3 views
1

У меня есть класс View, который имеет метод конструктора initialize Я думаю, что это метод-конструктор, исправьте меня, если он ошибается.Javascript, как переопределить метод конструктора?

var View = function(obj) { 
    this.initalize = obj.initalize; 
}; 

То, что я хотел бы достичь, вызывает вызов при создании экземпляра класса.

Как я могу передать объект таким образом?

var chatView = new View({ 
    initialize: function() { 
     alert('Yay for initialization'); 
    } 
}); 

Так что, когда я экземпляр View я могу передать объект в конструктор и в качестве ключевого initialize, значение которого является функцией и этот ключ специально вызывается, когда экземпляр.

+1

Возможный дубликат [Почему нельзя изменить конструктор функция из прототипа?] (http://stackoverflow.com/questions/9267157/why-is-it-impossible-to-change-constructor-function-from-prototype) – AMACB

+1

'obj.initalize()'? – Oriol

+0

* То, что я хотел бы достичь, вызывает вызов при создании экземпляра класса. * Затем назовите его. –

ответ

2

Если я получаю это право, есть простой способ достижения того, что вы хотите:

var View = function(obj) { 
    obj.initialize(); 
} 

Таким образом, функция инициализации вызывается всякий раз, когда вы экземпляр класса View.

Имейте в виду, что если вы хотите сделать реальный «код инициализации» внутри функции инициализации для работы, вы можете использовать call (или apply):

var View = function(obj) { 
    if (typeof obj.initialize === 'function') { 
     obj.initialize.call(this); 
    } 
} 

var chatView = new View({ 
    initialize: function() { 
     this.property = 'property'; 
    } 
}); 

console.log(chatView.property); // outputs property 
+0

Кажется законным, позвольте мне сделать снимок. Я заметил, что backbone.js делает что-то похожее на 'call()'. Мне нужно будет изучить, что он делает дальше. –

+0

Сладкий человек спасибо. Должен ли я быть в курсе всего этого, используя это? Любая конкретная причина, по которой '_.extend()' даст мне какую-то выгоду за это? –

+1

Я не являюсь пользователем библиотеки _, но я бы сказал, что если вы действительно хотите использовать эту концепцию «пользовательской инициализации», вы можете проверить доступность метода 'initialize' внутри' obj', прежде чем звонить ему, чтобы сделать Класс 'View' более надежный (я сделаю редактирование). – Samuel

0

Javascript не имеет конструктора, помните, что javascript основан на прототипе. Это пример «конструктора» вы можете создать

function Example (firstname, lastname) { 
this.firstname = firstname; 
this.lastname = lastname; 
} 

Example.prototype.getFullname = function() { 
return this.firstname + ' ' + this.lastname; 
} 

Если вы хотите создать функцию конструктора необходимо вызвать его после создания экземпляра функции.

Но это лучшая структура, которую вы можете использовать. Я рекомендовал, только если вам нужна функция-конструктор и частная функция. В противном случае используйте простую структуру с методами, объявленными прототипом, вы можете получить лучшую производительность.

var MyObject = (function() { 

    // Constructor 
    function MyObject (foo) { 
     this._foo = foo; 
    } 

    function privateFun (prefix) { 
     return prefix + this._foo; 
    } 

    MyObject.prototype.publicFun = function() { 
     return privateFun.call(this, '>>'); 
    } 

    return MyObject; 
})(); 


var myObject = new MyObject('bar'); 

С помощью этого кода у вас есть конструктор, но это «частная» функция, так что вы не можете перезаписать его после создания экземпляра объекта.

Здесь у меня есть ссылка создать тестирование Differents структуру: https://plnkr.co/edit/qzgWVZlnIFnWl0MoUe5n?p=preview

Результат:

Тест 1: ~ 15к (с частной функцией) - рекомендуется, только если вы хотите/нужен частный function

Тест 2: ~ 38k (с частной функцией) - Не рекомендуется, он возвращает объект, который действительно плох.

Тест 3: ~ 8k (без частной функции) - Рекомендуется, он имеет лучшую производительность, но вы не можете создать частную функцию, а значит, любой может вызвать любую функцию: S

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