OOP 之原型与原型链

发布于 2024-07-24 23:15:38 字数 1958 浏览 11 评论 0

prototype 原型对象


每个函数都有一个默认的 prototype 属性,其实际上还是一个对象,如果被用在继承中,姑且叫做原型对象

在构造函数中的 prototype 中定义的属性和方法,会被创建的对象所继承下来。举个栗子:

function F(){}
F.prototype.work = function(){
console.log('F is working..');
};
var f = new F();
f.work(); // F is working..

当你创建函数时, JS 会为这个函数自动添加 prototype 属性,值是空对象。而一旦你把这个函数当作构造函数( constructor )调用(即通过 new 关键字调用),那么 JS 就会帮你创建该构造函数的实例,实例继承构造函数 prototype 的所有属性和方法(实例通过设置自己的 __proto__ 指向构造函数的 prototype 来实现这种继承)

神秘的 proto


JS 的对象中都包含了一个 __proto__ 属性,其指向的是创建该对象时的构造函数的原型对象 prototype

从上面的输出结果看出, f.__proto__ 指向了其构造函数 Fprototype ,而 F.prototype 本身也是一个对象,其内部也有 __proto__ 属性,其指向的是 Object.prototype ,直到最后 Object.prototype 指向 null ,这条原型链才结束

因此, __proto__ 这个神秘的属性才是原型链形成的真正原因

原型链


由于原型对象本身也是对象,根据上边的定义,它也有自己的原型,而它自己的原型对象又可以有自己的原型,这样就组成了一条链,这个就是原型链, JavaScritp 引擎在访问对象的属性时,如果在对象本身中没有找到,则会去原型链中查找,如果找到,直接返回值,如果整个链都遍历且没有找到属性,则返回 undefined 。原型链一般实现为一个链表,这样就可以按照一定的顺序来查找

从上图看出:

  • Object.prototype 是顶级对象,所有对象都继承自它。
  • Function 继承 Function 本身, Function.prototype 继承 Object.prototype
  • Function.prototypeFunction.__proto__ 都指向 Function.prototype
  • Object.prototype.__proto__ === null ,说明原型链到 Object.prototype 终止

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

甜心

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

玍銹的英雄夢

文章 0 评论 0

我不会写诗

文章 0 评论 0

十六岁半

文章 0 评论 0

浸婚纱

文章 0 评论 0

qq_kJ6XkX

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文