Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.11.2018, 16:01
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Сделать функцию методом объекта
Можно ли в моём примере функцию parseContent сделать методом объекта content?
Код
function parseContent(id) {
    let txt = [];
    document.querySelectorAll(id + ' div').forEach((div, i) => txt[i] = div.textContent);
    return txt
}

const content = {
    header: parseContent('header'),
    main: parseContent('main'),
    footer: parseContent('footer')
}


Чтобы получить примерно такую запись:
const content = {
    header: this.parseContent('header'),
    main: this.parseContent('main'),
    footer: this.parseContent('footer'),

    parseContent: function(id) {
        let txt = [];
        document.querySelectorAll(id + ' div').forEach((div, i) => txt[i] = div.textContent);
        return txt
    }
}
Ответить с цитированием
  #2 (permalink)  
Старый 01.11.2018, 16:27
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,794

Чем ваш вариант вас не устраивает?
Ответить с цитированием
  #3 (permalink)  
Старый 01.11.2018, 16:36
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

<header><div>Header Text Content</div></header>
<script>
const content = {
     parseContent: function(id) {
       let txt = [];
        document.querySelectorAll(id + ' div').forEach((div, i) => txt[i] = div.textContent);
        return txt;
    },
    header: function () { return this.parseContent('header') },
    main: function () { return this.parseContent('main') },
    footer: function () { return this.parseContent('footer') }
}
alert(content.header());

</script>

Последний раз редактировалось Dilettante_Pro, 01.11.2018 в 16:40.
Ответить с цитированием
  #4 (permalink)  
Старый 01.11.2018, 16:43
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Сообщение от Nexus Посмотреть сообщение
Чем ваш вариант вас не устраивает?
Он меня устраивает, просто подумал можно ли так написать.

Теперь вроде переосмысливаю что мой вопрос идёт против логики. Методы работают со свойствами объекта, а у меня никакие свойства в функции не нужны. Поэтому нет смысла впихивать такую функцию в объект под видом метода.
Ответить с цитированием
  #5 (permalink)  
Старый 01.11.2018, 16:55
Аватар для MC-XOBAHCK
Профессор
Отправить личное сообщение для MC-XOBAHCK Посмотреть профиль Найти все сообщения от MC-XOBAHCK
 
Регистрация: 06.08.2017
Сообщений: 473

Dilettante_Pro, спасибо за пример с решением. Поучительный пример - получился объект из методов.
Если я правильно помню, JSON.stringify(content) отрежит все методы и получится пусто, а мне данные нужны.

Так что изначально мой вопрос глупый. Теперь буду знать.
Ответить с цитированием
  #6 (permalink)  
Старый 01.11.2018, 17:13
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,794

MC-XOBAHCK, я не обратил внимание на свойства вашего объекта, извините.
const content = {
    header: this.parseContent('header'),
    main: this.parseContent('main'),
    footer: this.parseContent('footer'),

    parseContent: function(id) {
        let txt = [];
        document.querySelectorAll(id + ' div').forEach((div, i) => txt[i] = div.textContent);
        return txt
    }
}

Так объявлять значения для свойств нельзя, ошибка будет.
Вы при объявлении значений свойств пытаетесь обратиться через контекст к еще не созданному объекту "content", поэтому this будет указывать не на объект "content", а на "родительскую" ОВ.
Разберите пример Dilettante_Pro, он исправил эту ошибку заменой свойств на методы.
Еще можно было бы сделать так, но это какое-то извращение:
const content = {
    parseContent: function(id) {
        let txt = [];
        document.querySelectorAll(id + ' div').forEach((div, i) => txt[i] = div.textContent);
        return txt
    }
};

['header', 'main', 'footer'].forEach(key => content[key] = content.parseContent(key));
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Свойство/метод объекта как константа ruslan_mart Flash 0 26.12.2013 15:39
Canvas. Как сделать или вообще нельзя? Вращение рандомизированно изменяемого объекта. Zemsky Общие вопросы Javascript 30 19.12.2013 19:44
Изменение объекта по ссылке. _SR_71_ Общие вопросы Javascript 1 28.08.2013 19:54
Можно ли получить имя экземпляра объекта внутри самого объекта? Ichigeki Общие вопросы Javascript 9 14.11.2008 19:00
Как сделать функцию типа toDataUrl для рисунка в ie6 ? Олег Общие вопросы Javascript 2 14.09.2008 00:06