我知道JavaScript中的继承概念是通过原型链实现的,但是我不确定我是否理解正确。读取属性后,引擎将首先搜索实例的自身属性,如果未找到,则会搜索实例的[[Prototype]]属性,该属性是对创建实例的函数原型的引用,搜索将继续进行,直到到达Object.prototype。对于以下代码:

var person1 = {
    name: "Qiushi",
    sayName: function() {
        console.log(this.name);
    }
};

person1.sayName();  // Qiushi

var person2 = Object.create(person1);
person2.name = "Alex";
console.log(person2.hasOwnProperty("sayName")); // false
person2.sayName();  // Alex


当person2从person1继承时,person2可以使用person1中定义的方法。但是sayName方法不是person1原型的属性,而是它本身的属性。我的问题是,方法搜索仅遵循原型链,person2将如何使用不在此链中的方法?

-------------------------------最终编辑----------------- --------

如果您对此问题也有同样的担忧,请阅读我和Jimbo之间的对话。

最佳答案

Object.create返回一个新对象,其中提供的参数是新对象的原型对象。

因此,您现在有了:

{person2}
    -名称:'Alex'
    -{原型}
        -名称:“ Quishi”
        -sayName:function


因此,如果您在person2上查找属性name,它将在person2本身上找到该属性,而不是在原型上查找。如果您查找sayName,它将不会在person2上找到它,因此它将在原型上查找并在那里找到它。

this关键字将在函数中引用,具体取决于函数在何处被称为FROM。这就是this的工作方式。当您在对象上调用方法时,该对象将是该方法内的this。因此,即使该方法在原型上,如果您调用thisperson2.sayName();仍将引用person2。如果要更改(例如通过.call),则可以更改输出。

console.log(person2.name); //->亚历克斯

person2.sayName(); //->亚历克斯
person2.sayName.call(person2 .__ proto__); //-> Quishi,即使在person2上进行了调用

person1.sayName(); //-> Quishi
person1.sayName.call(person2); //-> Alex,即使调用了person1


我指出这一点是因为在这个示例中,误解this的可能性与误解原型的可能性一样大。

关于javascript - 关于JavaScript继承的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34478861/

10-13 00:53