【发布时间】: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