为什么在构造函数中的方法之前需要 'this'?
Why do you need 'this' before a method in a constructor function?
在下面的代码中,我认为原型链的工作方式(基本上)是如果子对象(在本例中为 mike)本身没有方法,它会查找原型链,通过__ proto__,查看父对象是否在其原型对象中包含它,如果包含,那么 'mike' 应该可以访问它。对吗?
如果是这样,差不多,为什么 'farewell' 不能用于 mike?
显然,我可以看出是 'this.'(或缺少 'this.')造成了差异,但是如果 __ 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
这与原型没有太大关系。当您执行 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
没有以任何方式作为对象的一部分结束。
在下面的代码中,我认为原型链的工作方式(基本上)是如果子对象(在本例中为 mike)本身没有方法,它会查找原型链,通过__ proto__,查看父对象是否在其原型对象中包含它,如果包含,那么 'mike' 应该可以访问它。对吗?
如果是这样,差不多,为什么 'farewell' 不能用于 mike? 显然,我可以看出是 'this.'(或缺少 'this.')造成了差异,但是如果 __ 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
这与原型没有太大关系。当您执行 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
没有以任何方式作为对象的一部分结束。