首页 > 解决方案 > 为什么在构造函数中的方法之前需要“this”?

问题描述

在下面的代码中,我认为原型链的工作方式(基本上)是,如果子对象(在本例中为 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

标签: javascriptoopthisprototypeproto

解决方案


这与原型根本没有太大关系。当你这样做时会发生什么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不会以任何方式最终成为对象的一部分。


推荐阅读