Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Связь статических объектов с приватными переменными (https://javascript.ru/forum/misc/42679-svyaz-staticheskikh-obektov-s-privatnymi-peremennymi.html)

okouser 05.11.2013 17:21

Связь статических объектов с приватными переменными
 
empty

Faab 05.11.2013 18:06

Если честно я не совсем понимаю что вам надо, но может быть так:

function A(input)
{
 var _name;
 
 this.getName = function()
 {
  return _name;
 };
 
  this.setName = function(input)
 {
  _name = input;
 };
 
};

window.onload=function(){
  exemplareObject = new A();
  exemplareObject.setName('test');
  var testVaribele = exemplareObject.getName('test');
  alert("testVaribele :  " +  testVaribele);
  alert("_name : " + _name);
}


Я понял... речь о статических методах. Я правильно понимаю: вы пытаетесь создать что-то типо статического getter и setter?

danik.js 05.11.2013 18:41

В джаваскрипте нет приватных свойств. Используй символ подчеркивания для условности.

danik.js 05.11.2013 18:46

Цитата:

Сообщение от okouser
И почему как надо не работает все-таки такая конструкция

Потому что прототип - он один, общий. Это один объект. И ты при каждом вызове конструктора перетираешь его свойства.

danik.js 05.11.2013 18:48

Цитата:

Сообщение от okouser
Как это нет.

Ты не умеешь отличать свойства от локальных переменных? Думаю дальше не о чем говорить..

danik.js 05.11.2013 18:59

Во втором случае метод toString вызывается сразу, до его затирания (которое происходит при создании нового экземпляра)

рони 05.11.2013 19:13

okouser,
:write:
function A(name)
{
 var _name = 'test';

 A.prototype.getName = function()
 {
  return _name + this._name;
 };

 A.prototype.setName = function(value)
 {
  this._name = value;
 };

 A.prototype.toString = function()
 {
  return this.getName();
 };

 this.setName(name);
};

A.A1 = new A("1");
A.A2 = new A("2");
A.A3 = new A("3");
alert(A.A1); // test1
alert(A.A2); // test2
alert(A.A3); // test3
A.A2.setName(12345)
alert(A.A2); // test12345
alert(A.A3); // test3

danik.js 05.11.2013 19:14

Это не архитектура а говнокод. С говнокодом помочь не могу..

Faab 05.11.2013 19:19

Я просто сейчас как раз читаю раздел ООП в JS: мне это тоже интересно.

Вы пишите про статические экземпляры класса, но мне это не о чём не говорит. Я знаю суть статического свойства класса и статического метода класса, но в чём суть статического экземпляра класса?


A.prototype.setName = function(value){
  _name = value;
};


Вот эту строчку я перевожу как: присвоить всем инстанциям этого объекта метод setName. Зачем его указыввать внутри объекта? Я так понял из теории, что внутри объекта вы просто объявляете метод.. А вот если после объявления объекта вам надо присвоить новый метод и метод должен принадлежать всем инстанциям этого объекта, то нужно образаться к свойству (или методу?) prototype

danik.js 05.11.2013 19:31

Цитата:

Сообщение от okouser
Если такой умный и профессиональный, то нужно привести контрпример грамотной архитектуры.

Так ты сначала поясни что ты понимаешь под "статическим объектом". И вообще, опиши задачу внятно.

danik.js 05.11.2013 19:33

Цитата:

Сообщение от okouser
Создание объектов по типу Enum.

Как это понимать? В моем понимании enum - упорядоченный набор констант. Причем тут создание объектов?

danik.js 05.11.2013 19:44

Приведи тогда код на Java или C# того, что ты хочешь сделать в js.

danik.js 05.11.2013 20:18

А причем тут Enum?


Чем не нравится такой вариант?
function A(name) {
    this.name = name;
}

A.prototype.toString = function() {
    return this.name;
};

A.A1 = new A("1");
A.A2 = new A("2");
A.A3 = new A("2");



Более строгий, ES5 (IE8- отпадает) вариант:

function A(name) {
    this._name = name;
}

A.prototype = {
    get name() { return this._name },
    set name(value) { this._name = value },
    toString: function() { return this.name }
};

Object.defineProperty(A.prototype, 'constructor', {value: A});

A.A1 = new A("1");
A.A2 = new A("2");
A.A3 = new A("2");

danik.js 05.11.2013 20:43

Цитата:

Сообщение от okouser
Здесь namе может быть доступным кому угодно, но в ООП есть масса примеров, когда переменная должна быть приватной: так называемый принцип черного ящика.

Верно, но в js нет приватных свойств. Используй TypeScript


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