2016-08-31 4 views
0

Когда вызывается c1.rand, я не понимаю, как интерпретатор имеет доступ к this.num, потому что функция-конструктор еще не была вызвана. Не следует ли звонить constructor() в rand, чтобы установить значение для this.num?Почему метод вызван новым экземпляром?

class C { 
    constructor() { 
     this.num = Math.random(); 
    } 
    rand() { 
     console.log("Random: " + this.num); 
    } 
} 

var c1 = new C(); 
c1.rand(); // "Random: 0.4324299..." (any number from 0 to 1) 
+0

Функция-конструктор вызывается при создании экземпляра. нет необходимости запускать его вручную –

+0

@DayanMorenoLeon Спасибо. Есть что-то особенное в конструкторе слов? – MattGoldwater

+1

@ Gwater17- * constructor * не является ключевым словом или зарезервированным словом. Специально это означает, что конструктор «*» (также называемый функцией конструктора) является объектом функции, который поддерживает внутренний метод '[[Construct]]. * (См. [* ECMA-262 §6.1.7.2 * ] (http://ecma-international.org/ecma-262/7.0/index.html#sec-object-internal-methods-and-internal-slots)). Существует свойство конструктора экземпляров, но оно общедоступно и доступно для записи, поэтому оно не особенно полезно. – RobG

ответ

3

Когда c1.rand называется я не ясно, как интерпретатор может получить доступ к this.num, потому что функция конструктор не была вызвана.

Да, у него есть. Вы назвали конструктор, когда вы писали

var c1 = new C(); 

ли только конструктор функция называется б/с конструктором специальным ключевым словом?

Да, если class имеет constructor функцию, определенную будет вызываться при вызове класса с new ключевого слова.

Свойство constructor также доступно через прототип экземпляра.

var c1 = new C(); 
c1.constructor === C //=> true 
+0

Является ли только конструкторская функция, называемая конструктором b/c, специальным ключевым словом? – MattGoldwater

+0

lol @ down-vote, когда этот ответ идентичен ответному голосованию и представлен ему. – naomik

+0

Единственное, что я вижу, это тот, который я получил. – MattGoldwater

4

Конструкторы сразу вызывается при создании объекта, поэтому, когда вы звоните:

var c1 = new C(); 

Конструктор вызывается. Конструктор имен приходит из использования, он немедленно вызывается, потому что он конструирует объект. Это означает, что он инициализирует переменные и т. Д. - вещи, необходимые для объекта, this.num в вашем случае. И да, это зарезервированная функция для создания объекта при объявлении класса.

Ключевое слово new говорит «новый экземпляр» и при создании нового экземпляра вызывается конструктор.