Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Инициализация объекта (https://javascript.ru/forum/misc/52347-inicializaciya-obekta.html)

JS2DX 15.12.2014 11:38

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

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


Кто нибудь еще использует схожие конструкторы объектов?

danik.js 15.12.2014 12:49

Цитата:

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

Erolast 15.12.2014 13:03

Цитата:

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

JS2DX 15.12.2014 19:03

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

существует ли пример где метод стоило бы оставить внутри tester(){}?

Erolast 15.12.2014 19:09

В прототип помещаются общие разделяемые свойства/методы.
В конструкторе объекту присваиваются собственные свойства/методы, отличные (!!!) от таковых других экземпляров.
При обращении к свойству (методу) объекта поиск сначала происходит в самом объекте, затем в прототипе, затем в прототипе прототипа и так до тех пор, пока оно не будет найдено.
При присвоении свойству объекта значения оно записывается именно в объект, прототип не затрагивается.

krutoy 15.12.2014 20:14

Цитата:

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

danik.js 16.12.2014 01:34

this._data

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


Часовой пояс GMT +3, время: 11:09.