Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Независимые свойства объектов в переменных (https://javascript.ru/forum/misc/36084-nezavisimye-svojjstva-obektov-v-peremennykh.html)

user222 03.03.2013 20:21

Независимые свойства объектов в переменных
 
Я не знаю как это называется, и название топика такое же.
Видел на одном сайте очень удобную штуку для работы с данными пользователей.
var vasea = users.findByName('Вася');
var alex = users.findByName('Саша');

alert(vasea.lastname); //Пупкин
alert(alex.lastname); //Иванов

Как возвращать - я ещё понимаю - просто return {lastname: ...};
Но возможно ли изменять потом их? Посмотрел http://javascript.ru/tutorial/object и стал пробовать:
var numbers = {
    all : ['ноль', 'один', 'два', 'три'],

    find : function(num) {
        this.text = this.all[num];

        return this;
    }
};

var zero = numbers.find(0);
var two = numbers.find(2);

alert('0=' + zero.text); //0=два
alert('2=' + two.text); //2=два

Ну это логично. Мы же меняем одно и то же.
Пробовал куда-то впихнуть prototype, хотя я не совсем понял как с ним работать. Точнее не понял как он может мне помочь. Но всё равно у меня получилось 0=2.
Тогда у меня другая идея.
numbers = {find:function(num){return new numbers_sys(num)}};

numbers_sys будет работать с window.all, которая ['ноль', 'один', 'два', 'три']
Но я чувствую, что оно делается не так.
Под "менять" имею в виду
numbers.find(2).text; //два
numbers.find(2).setText('двойка');
numbers.find(2).text; //двойка

Как это делается? Да и возможно ли это вообще... Может надо делать как я думаю - return new ...

user222 03.03.2013 21:42

window.all = ['ноль', 'один', 'два', 'три'];

var numbers = {
    find : function(num) {
        var ret = {};
        ret.num = num;
        ret.text = window.all[num];

        ret.setText = function(text) {
            window.all[this.num] = text;
            this.text = text;
            return this;
        };

        return ret;
    }
};

var zero = numbers.find(0);
var two = numbers.find(2);

console.log('0=' + zero.text); //ноль
console.log('2=' + two.text); //два
two.setText('двойка');
console.log('2=' + two.text); //двойка
console.log(numbers.find(2).text); //двойка

Но это ведь бред... Я так думаю...
Так надо? Правильно?

user222 03.03.2013 23:42

nasqad,
Да нет. Так не получится.
var pavel = users.getBy('name', 'pavel');
pavel.setParam('rank', 'tester');

мы так не можем, вы возвращаем return stack.length > 1 ? stack : stack[0];
Тогда я вижу выход - сделать ret и дать ему пачку функций как я сделал в #2
Но в этом и вопрос - так ли это надо делать?

user222 04.03.2013 07:03

Сделал вот так
window.all = ['ноль', 'один', 'два', 'три'];

var numbers = {
    find : function(num) {
        var ret = {};

        ret.setText = function(text) {
            window.all[this.num] = text;
            this.text = text;
            return this;
        };

        ret.num = num;
        ret.text = window.all[num];

        return ret;
    },

    findByText : function(text) {
        var num = 0;

        window.all.every(function(val, key){
            if(val == text) {
                num = key;
                return false;
            }
            return true;
        });

        return this.find(num);
    }
};
/////////////////////////////////////////////
var zero = numbers.find(0);
var two = numbers.find(2);
var one = numbers.findByText('один');

console.log('zero.text=' + zero.text); //ноль
console.log('two.text=' + two.text); //два
two.setText('двойка');
console.log('two.text=' + two.text); //двойка
console.log('numbers.find(2).text=' + numbers.find(2).text); //двойка

console.log('one.text=' + one.text); //один
one.setText('единица');
console.log('one.text=' + one.text); //единица
console.log('numbers.findByText(\'единица\').text=' + numbers.findByText('единица').text); //единица

Работает идеально, смотрится отлично.
Всё правильно сделал?

danik.js 04.03.2013 07:29

window.all - так это же в ишаке зарезервированное свойство.
Да и зачем в гобале хранить эти "цифры"? может в numbers и хранить?

nerv_ 04.03.2013 16:43

Цитата:

Сообщение от user222
Сделал вот так
window.all = ['ноль', 'один', 'два', 'три'];

Цитата:

Сообщение от danik.js
window.all - так это же в ишаке зарезервированное свойство.
Да и зачем в гобале хранить эти "цифры"? может в numbers и хранить?

мало ли кому еще пригодится :D

Цитата:

Сообщение от nasqad
я вам жекверю сделал, а вы

не все способны оценить :)


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