为什么我们不能通过obj.prototype.function()访问函数,为什么原型函数不能访问'this'?

Why can't we access function via obj.prototype.function(), why prototype function can't access 'this'?

提问人:JVJplus 提问时间:10/30/2020 最后编辑:Donald DuckJVJplus 更新时间:7/15/2021 访问量:42

问:

3 个不同的调用彼此之间有何不同?

let Person=function(name){
    this.name=name;
};

Person.prototype.func=function(){
    console.log('Hey I am '+this.name);
};

let jay=new Person("jay");

jay.func(); /*This Works*/
jay.__proto__.func(); /*This doesn't have access to this.name? why?*/
jay.prototype.func(); /*This gives error, Why?*/

javascript 这个 原型链

评论


答:

3赞 CertainPerformance 10/30/2020 #1

当你这样做时

jay.__proto__.func();

您可以使用最后一个点之前的所有内容的调用上下文调用该函数:即,使用 的 ,它与 是相同的对象:functhisjay.__proto__Person.prototype

let Person=function(name){
    this.name=name;
};
Person.prototype.func=function(){
    console.log(this === Person.prototype);
    console.log(this === jay.__proto__);
};
let jay=new Person("jay");
jay.__proto__.func();

该属性位于实例本身上。它不在原型上,因此在方法内部引用 when 是原型不会显示实例的属性。namejaythis.namethisname

如果您改用: ,也可以使调用以正确的方式工作: ,这将调用设置为 not 的函数。this.calljay.__proto__.func.call(jay);thisjayjay.__proto__

jay.prototype.func(); /这会产生错误,为什么?/

该物业有点令人困惑。它通常只有在它是函数的属性时才有意义,在这种情况下,从该函数创建的实例具有该原型对象的内部原型(或)。.prototype__proto__

在正常情况下以及几乎其他任何地方,该属性并不意味着任何特殊之处,并且可能不存在。所以 中不存在任何内容。.prototypejay.prototype

评论

0赞 JVJplus 10/30/2020
谢谢,我理解 .prototype 用于类或函数构造函数,而 .__proto__ 用于实例。