Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сделать функцию методом объекта (https://javascript.ru/forum/misc/75733-sdelat-funkciyu-metodom-obekta.html)

MC-XOBAHCK 01.11.2018 16:01

Сделать функцию методом объекта
 
Можно ли в моём примере функцию 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
    }
}

Nexus 01.11.2018 16:27

Чем ваш вариант вас не устраивает?

Dilettante_Pro 01.11.2018 16:36

<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>

MC-XOBAHCK 01.11.2018 16:43

Цитата:

Сообщение от Nexus (Сообщение 497633)
Чем ваш вариант вас не устраивает?

Он меня устраивает, просто подумал можно ли так написать.

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

MC-XOBAHCK 01.11.2018 16:55

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

Так что изначально мой вопрос глупый. Теперь буду знать.

Nexus 01.11.2018 17:13

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));


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