Понимание выполнения свойств в функции Javascript - PullRequest
0 голосов
/ 13 октября 2018

Я начинаю изучать javascript, и я запутался в выполнении свойств в функции javascript.

Предположим, у меня есть такая функция

function Counter() {
  this.num = 0;
this.timer = console.log('hey');
};

теперь в этой функцииУ меня есть Num и таймер в качестве свойства функции счетчика.когда я пытаюсь создать экземпляр функции Constructor, свойство timer выполняется enter image description here

, но когда я пытаюсь вызвать свойство timer явно, я не получаю значение /собственность не исполняется.

enter image description here

в чем причина этого?

Ответы [ 3 ]

0 голосов
/ 13 октября 2018

теперь в этой функции у меня есть num и timer в качестве свойств функции Counter.

Нет, у вас есть num и timer свойства объектов создается , вызывая Counter в качестве конструктора (через new, или Reflect.construct и т. д.).

, но когда я пытаюсь явно вызвать свойство timer, я неполучение значения / свойство не выполняется

Коротко о терминологии (поскольку это поможет продолжить обучение), вы не «вызываете» свойства, а свойства не «выполняются»«.Вы «получаете» их значение, или «получаете к ним доступ», или «читаете» их.(Или, когда они находятся слева от назначения, вы «устанавливаете» их или «назначаете» их или «пишете» им.)

Ваш код успешно получает значениесвойство timer, которое является значением, которое вернуло console.log('hey'), то есть undefined.

Если вы намеревались сделать что-то с timer, чтобы он запускал console.log, вы быхотите поместить его в функцию:

this.timer = function() {
    console.log('hey');
};

, а затем вызвать ее (потому что вы выполняете функции "вызова"):

d.timer();

Примечание:

Если это то, что вы хотели сделать, в то время как совершенно нормально создавать функции внутри конструктора, то несколько чаще назначать их объекту-прототипу, который new Counter даст объектам, которые онсоздает.В ES5 и более ранних версиях вы можете сделать это следующим образом:

function Counter() {
    this.num = 0;
} // <== No ; here, it's a declaration, not a statement

Counter.prototype.timer = function() {
    console.log('hey');
};

В ES2015 + вы, вероятно, вместо этого будете использовать синтаксис class:

class Counter() {
    constructor() {
        this.num = 0;
    }

    timer() {
        console.log('hey');
    };
}

Вы используете их одинаковоспособ (через new).

0 голосов
/ 13 октября 2018

При создании нового объекта с использованием Counter в качестве конструктора создается новый объект с 2 свойствами, то есть num и timer.num инициализируется на 0, в то время как timer инициализируется с возвращаемым значением функции console.log(), равной undefined.Это возвращаемое значение сохраняется как значение свойства таймера, и каждый раз, когда вы получаете его при чтении.

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

function Counter() {
  this.num = 0;
};

Counter.prototype.timer = function() {
  this.timer = console.log('hey');
}

let obj = new Counter();

obj.timer();
0 голосов
/ 13 октября 2018

Это довольно просто.

this.timer = console.log('hey');

Эта строка присваивает свойству timer возвращаемое значение console.log('hey').

console.log printв консоли, но ничего не возвращает, поэтому ваше свойство остается undefined.

Вы запутались, потому что смешиваете то, что напечатано в консоли, и фактическое возвращаемое значение.

Если выпросто запустите в консоли следующее: console.log('hey'), вы увидите следующее: hey затем undefined.Что печатает функция console.log, затем ее возвращаемое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...