Инициализация объекта
Почитал статей на данную тему. Мне показался интересным нижеизложенный подход хотя это не копия одного из уже существующих способов о которых мне удалось прочитать.
Здесь создается объект с кодом методов внутри объекта а его прототип перекладывает вызовы на внутренние методы. Конструктор вызывается с помощью "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, время: 15:12. |