gpt4 book ai didi

javascript - 关于 JavaScript 继承的困惑

转载 作者:行者123 更新时间:2023-11-30 07:35:37 24 4
gpt4 key购买 nike

我知道 JavaScript 中的继承概念是通过原型(prototype)链,但我不确定我是否理解正确。当一个属性被读取时,引擎将首先搜索实例自身的属性,如果没有找到将搜索实例的 [[Prototype]] 属性,它是对创建实例的函数原型(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 原型(prototype)的属性,而是它自己的属性。我的问题是,由于方法搜索仅遵循原型(prototype)链,person2 将如何使用不在此链中的方法?

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

如果你也有同样的问题,请阅读我和Jimbo的对话。

最佳答案

作为其他对象原型(prototype)的对象没有什么特别之处,它们只是对象。

当引擎去读取一个属性时,首先它会查看对象本身是否有它,如果有,就使用它。如果没有,它会查看对象的原型(prototype),然后查看它的原型(prototype),等等。

在你的代码中,person1person2 的原型(prototype),所以在 person2 上查找 sayName 时,由于引擎没有在 person2 上找到它,它会在 person2 的原型(prototype) person1 上查找并找到它。

这是您在代码中设置的内容的简单 ASCII 艺术图表:

                                  +-------------------+person1-----------------------+-->|     (object)      |                              |   +-------------------+                              |   | __proto__         |-->(not shown, Object.prototype)                              |   | name: "Qiushi"    |                              |   | sayName: function |                              |   +-------------------+                              |            +--------------+  |person2---->|   (object)   |  |            +--------------+  |            | __proto__    |--+            | name: "Alex" |            +--------------+

这是一个更完整的版本:

          +------------+                                  Object--->| (function) |  +->(not shown, Function.prototype)                                        +------------+  |                                           | __proto__  |--+                                  +--------------------+          | prototype  |---------------------------------+-->|      (object)      |          +------------+                                 |   +--------------------+                                  +-------------------+  |   |   __proto__: null  |person1-----------------------+-->|     (object)      |  |   | toString: function |                              |   +-------------------+  |   | valueOf: function  |                              |   | __proto__         |--+   | ...                |                              |   | name: "Qiushi"    |      +--------------------+                              |   | sayName: function |                                 |   +-------------------+                                 |                                       +--------------+  |person2---->|   (object)   |  |            +--------------+  |            | __proto__    |--+            | name: "Alex" |            +--------------+

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com