【问题标题】:Why do you need 'this' before a method in a constructor function?为什么在构造函数中的方法之前需要“this”?
【发布时间】:2020-01-27 15:09:58
【问题描述】:

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

【问题讨论】:

  • 所以它属于实例。
  • farewell 只是构造函数内部的一个局部变量(好吧,因为你省略了var 它不是,但让我们把它放在一边)......它没有附加到任何对象方式作为一种属性,更不用说任何原型。
  • farewell 还会是什么?如果没有this,会获得什么价值?您希望将函数附加到您在其中调用的函数似乎“显而易见”,但语法规则将该值分配给farewell,这应该是该函数范围之外的变量。最简洁的答案是“因为这就是语言的工作方式”。我不知道还能怎么说。
  • 只是一个小小的观察,在你的构造函数中做 -> this.greet = 否定了这个和原型的全部意义。如果你这样做,每个实例都会有它自己的greet 方法。要获得使用原型链的优势,您应该这样做 -> PersonConstructor.prototype.greet = ..... 或使用类语法,而不是方法语法。
  • @Dave 我明白了。我通常会尝试引用正文中的最后一个问题而不是标题,因此这种联系并不完全明显。

标签: javascript oop this prototype proto


【解决方案1】:

这根本与原型没有太大关系。当您执行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 不会以任何方式成为对象的一部分。

【讨论】:

    猜你喜欢
    • 2019-09-05
    • 2018-06-02
    • 2020-03-10
    • 1970-01-01
    • 2013-01-04
    • 2021-06-17
    • 2014-12-07
    • 2012-07-14
    相关资源
    最近更新 更多