Инициализация объекта
Почитал статей на данную тему. Мне показался интересным нижеизложенный подход хотя это не копия одного из уже существующих способов о которых мне удалось прочитать.
Здесь создается объект с кодом методов внутри объекта а его прототип перекладывает вызовы на внутренние методы. Конструктор вызывается с помощью "call()". Создается изоляция внутренних данных и кода что позволяет менять содержимое прототипов без последствий для кода методов. function tester(){ var data = ['a','b'], ini = function(){ this.getData = function(_i){return data[_i]}, this.setData = function(_i){data[_i] = 'new';return true;} } ini.call(this) } tester.prototype = { getData: function(_i){return this.getData(_i)}, setData: function(_i){return this.setData(_i)} } var t1 = new tester() var t2 = new tester() console.log(t1.getData(0)) console.log(t2.getData(1)) console.log(t2.setData(1)) console.log(t1.getData(1)) console.log(t2.getData(1))
Кто нибудь еще использует схожие конструкторы объектов? |
Цитата:
function tester(){ var data = ['a','b']; this.getData = function(_i){return data[_i]}, this.setData = function(_i){data[_i] = 'new';return true;} } Цитата:
|
Цитата:
|
вы предлагаете tester(){} оставлять пустым? если я понимаю правильно данные необходимо оставить там иначе если их поместить в прототип они "переплетутся" между t1 и t2.
существует ли пример где метод стоило бы оставить внутри tester(){}? |
В прототип помещаются общие разделяемые свойства/методы.
В конструкторе объекту присваиваются собственные свойства/методы, отличные (!!!) от таковых других экземпляров. При обращении к свойству (методу) объекта поиск сначала происходит в самом объекте, затем в прототипе, затем в прототипе прототипа и так до тех пор, пока оно не будет найдено. При присвоении свойству объекта значения оно записывается именно в объект, прототип не затрагивается. |
Цитата:
Но вообще, если вы напишете во так function tester(){ this.data = ['a','b'] } tester.prototype.getData=function(name){return this.data[name]} tester.prototype.setData=function(name, newValue){return this.data[name]=newValue} var t1 = new tester() var t2 = new tester() console.log(t1.getData(0)) console.log(t2.getData(1)) console.log(t2.setData(1, "new")) console.log(t1.getData(1)) console.log(t2.getData(1)) будут примерно те же яйца, и большинство случаев покроют, отличие в том, что в Вашем случае, data приватна, инкапсулирована, ее нельзя изменить из-вне, но ваш код жрет память. |
this._data Этого вполне достаточно. Плюс еще фишка! :)) Когда доступ к приватному свойству все-таки нужен, ну прям позарез - то его легко получить! Без всяких там рефлексий и прочей чепухи! |
Часовой пояс GMT +3, время: 18:20. |