Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.12.2014, 11:38
Интересующийся
Отправить личное сообщение для JS2DX Посмотреть профиль Найти все сообщения от JS2DX
 
Регистрация: 20.04.2014
Сообщений: 23

Инициализация объекта
Почитал статей на данную тему. Мне показался интересным нижеизложенный подход хотя это не копия одного из уже существующих способов о которых мне удалось прочитать.

Здесь создается объект с кодом методов внутри объекта а его прототип перекладывает вызовы на внутренние методы. Конструктор вызывается с помощью "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))

  • a
    b
    true
    b
    new


Кто нибудь еще использует схожие конструкторы объектов?
Ответить с цитированием
  #2 (permalink)  
Старый 15.12.2014, 12:49
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от JS2DX
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)
}
Это можно переписать иначе:
function tester(){
  var data = ['a','b'];
  this.getData = function(_i){return data[_i]},
  this.setData = function(_i){data[_i] = 'new';return true;}
}


Сообщение от JS2DX
getData: function(_i){return this.getData(_i)}
Это к чему вообще написано? Метод из прототипа все равно не будет вызван. Будет вызвана функция getData из свойства инстанса. Кстати создавать функции в конструкторе - не гуд. Они должны быть в прототипе, общими для всех инстансов.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 15.12.2014, 13:03
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
Они должны быть в прототипе, общими для всех инстансов.
..потому что иначе произойдет просто перерасход памяти. Персонально для каждого объекта создавать функцию стоит лишь тогда, когда это действительно надо.

Последний раз редактировалось Erolast, 15.12.2014 в 13:07.
Ответить с цитированием
  #4 (permalink)  
Старый 15.12.2014, 19:03
Интересующийся
Отправить личное сообщение для JS2DX Посмотреть профиль Найти все сообщения от JS2DX
 
Регистрация: 20.04.2014
Сообщений: 23

вы предлагаете tester(){} оставлять пустым? если я понимаю правильно данные необходимо оставить там иначе если их поместить в прототип они "переплетутся" между t1 и t2.

существует ли пример где метод стоило бы оставить внутри tester(){}?
Ответить с цитированием
  #5 (permalink)  
Старый 15.12.2014, 19:09
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

В прототип помещаются общие разделяемые свойства/методы.
В конструкторе объекту присваиваются собственные свойства/методы, отличные (!!!) от таковых других экземпляров.
При обращении к свойству (методу) объекта поиск сначала происходит в самом объекте, затем в прототипе, затем в прототипе прототипа и так до тех пор, пока оно не будет найдено.
При присвоении свойству объекта значения оно записывается именно в объект, прототип не затрагивается.
Ответить с цитированием
  #6 (permalink)  
Старый 15.12.2014, 20:14
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Сообщение от JS2DX
существует ли пример где метод стоило бы оставить внутри 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 приватна, инкапсулирована, ее нельзя изменить из-вне, но ваш код жрет память.

Последний раз редактировалось krutoy, 15.12.2014 в 20:38.
Ответить с цитированием
  #7 (permalink)  
Старый 16.12.2014, 01:34
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

this._data

Этого вполне достаточно. Плюс еще фишка! )
Когда доступ к приватному свойству все-таки нужен, ну прям позарез - то его легко получить! Без всяких там рефлексий и прочей чепухи!
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Canvas. Как сделать или вообще нельзя? Вращение рандомизированно изменяемого объекта. Zemsky Общие вопросы Javascript 30 19.12.2013 19:44
Инициализация объекта после подгрузки ajax Ваяс AJAX и COMET 4 24.11.2013 13:46
Скрипт вычисления координат объекта banderasantonio197555 Events/DOM/Window 4 16.08.2011 17:37
прямая от первого объекта до второго ntro123 Events/DOM/Window 5 09.05.2011 08:41
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00