Зачем вам нужно это перед методом в функции конструктора? - PullRequest
0 голосов
/ 27 января 2020

В приведенном ниже коде я думаю, что цепочка прототипов работает (в основном) так, что если дочерний объект (в данном случае mike) не имеет самого метода, он ищет цепочку прототипов через __proto__ Чтобы увидеть, есть ли у родительского объекта его в своем объекте-прототипе, и если это так, то у 'mike' должен быть доступ к нему. Правильно?

Если это так, то почему "прощание" недоступно для Майка? Очевидно, я вижу, что это «это». (или его отсутствие), что имеет значение, но если __proto__ позволяет дочернему объекту получать доступ к методам в объектах-прототипах родителей, почему мы должны беспокоиться об этом. вообще ??

Спасибо большое!

function PersonConstructor() {
  this.greet = function sayHello() {
    console.log("hello");
  };
  farewell = function sayBye() {
    console.log("Bye");
  };
}

function personFromConstructor(name, age) {
  const person = new PersonConstructor();
  person.name = name;
  person.age = age;
  return person;
}

const mike = personFromConstructor("Mike", 30);

console.log(mike.greet); // [Function: sayHello]
console.log(mike.farewell); // undefined

1 Ответ

1 голос
/ 27 января 2020

Это не имеет ничего общего с прототипами вообще. То, что происходит, когда вы делаете new PersonConstructor(), упрощенно:

let obj = {};
/* [ here be dragons and details about setting up prototype chains ] */
PersonConstructor.call(obj);  // `this` inside PersonConstructor is obj
return obj;

По сути, это эквивалентно:

let obj = {};
obj.greet = function sayHello() {
  console.log("hello");
};
farewell = function sayBye() {
  console.log("Bye");
};

И это должно показать, почему farewell не заканчивается как часть объекта в любом случае.

...