我知道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
。因此,即使该方法在原型上,如果您调用this
,person2.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/