0

Написал такую штуку: Вопросы собственно в коде.

var Person = {
 constructor: function(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;
  return this; //Что тут возвращает this? Все аргументы из фунцкии или что?
 },
};

/________________________/

var WebDeveloper = Object.create(Person); //Тут пока всё более-менее понятно WebDeveloper.constructor = function(name, age, gender, skills) { Person.constructor.apply(this, arguments); //что делает apply? я читал, что устанавливает значение this в функции. Отсюда и вопрос: разве this это типо не ключевое слово а-ля var? this.skills = skills || []; //что собственно тут устанавливается? skills или массив? пустой? и когда сработает skills, а когда массив? значение skills внутри функции теперь становится и значением skills которая за пределами функции - это я понял. ну а метод apply тут причем? return this; };

var developer = Object.create(WebDeveloper).constructor("Jack", 21, "male", ["html", "css", "js", "php", "mysql"]);

ebaklak
  • 123

1 Answers1

1

var Person = {
 constructor: function(name, age, gender) {
  this.name = name;
  this.age = age;
  this.gender = gender;
  return this; // A: Что тут возвращает this? Все аргументы из фунцкии или что?
                             // Q: Зависит от метода вызова.
                             //   Метод: Person
                             //   Функция: window (или undefined в строгом режиме)
 },
};

/________________________/

var WebDeveloper = Object.create(Person); //Тут пока всё более-менее понятно WebDeveloper.constructor = function(name, age, gender, skills) { Person.constructor.apply(this, arguments); // A: что делает apply? я читал, что устанавливает значение this в функции. Отсюда и вопрос: разве this это типо не ключевое слово а-ля var? // Q: Действительно, вызывает с указанным this. Здесь передаётся текущий this this.skills = skills || []; // A: что собственно тут устанавливается? skills или массив? пустой? и когда сработает skills, а когда массив? значение skills внутри функции теперь становится и значением skills которая за пределами функции - это я понял. ну а метод apply тут причем? // Q: Устанавливается свойство равное или skills, либо, если он false, пустой массив // apply вызывает родительский конструктор, чтобы он навесил свои значения (паттерн такой есть) return this; };

var developer = Object.create(WebDeveloper).constructor("Jack", 21, "male", ["html", "css", "js", "php", "mysql"]);

  • спасибо огромное =) – ebaklak Feb 14 '17 at 17:56
  • @ebaklak, Пожалуйста :) –  Feb 14 '17 at 17:57
  • Конструктор: Person - это как?:) – Grundy Feb 14 '17 at 17:57
  • Имелось ввиду классы. Тут не класс, но если бы был бы... :) –  Feb 14 '17 at 17:58
  • @Other, если метод используется как конструктор this - это всегда создаваемый объект, а у тебя получилось, что это существующий – Grundy Feb 14 '17 at 18:05
  • @Grundy, давайте я просто уберу упоминание о классах? Я не указывал какой именно -- создаваемый или существующий -- будет объект. –  Feb 14 '17 at 18:09
  • @Other, у тебя было написано Person, что совпадает с ранее объявленной переменной :) – Grundy Feb 14 '17 at 18:15
  • @Grundy, какие Ваши доказательства? Внутри всё равно был бы экземпляр от Person. Не сам Person, конечно. –  Feb 14 '17 at 18:17
  • Также можно упомянуть, что возврат из конструктора определяет фабрику, заменяет создаваемый объект. Возврат this таким образом можно опустить. – vp_arth Feb 20 '17 at 09:26