теперь в этой функции у меня есть 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
).