JavaScript原型链详解


Posted in Javascript onNovember 07, 2021

1、构造函数和实例

假设你声明一个方法叫做Foo() ,那么我们可以通过new Foo()来声明实例。

function Foo() {
      console.log("我是一个构造方法");
    }
    const f1 = new Foo();

现在你可以很清晰的明白Foo()是构造函数,f1是它的实例。

2、属性Prototype

Foo()这个构造函数是一个方法。

方法也是对象数据类型,所以可以说方法是个对象。

对象就有属性,不过方法有自己特殊的一个属性,叫做prototype,其他对象没有哦。

这个属性会指向一个原型对象(Foo.prototype),而原型对象也会有一个自己的属性叫做constructor,指向属性包含了一个指针,指回原构造函数。

 

function Foo() {
      console.log("我是一个构造方法");
    }
    const f1 = new Foo();

    console.log(Foo.prototype);//Foo的原型对象
    console.log(f1.prototype);//f1没有 underfied

JavaScript原型链详解

3、属性__proto__

上文的prototype是给构造函数的所有实例提供共享方法和属性的。

实例又是怎么访问到共享方法和属性的呢?

f1实例没有prototype,而有一个属性__proto__,这是所有对象都有的属性,它指向到构造自己的构造函数的原型对象,然后js这个语言就是根据这个属性来让实例访问到共享属性和方法的

Foo是f1的构造函数,Foo.prototypeFoo的原型对象,所以f1.__proto__指向Foo.prototype

function Foo() {
      console.log("我是一个构造方法");
    }

    const f1 = new Foo();

    console.log(Foo.prototype);
    console.log(f1.__proto__);

JavaScript原型链详解

4、访问原型上的方法

Foo这个构造函数如果希望自己的实例能够拥有同一个属性,比如name,就在自己的原型对象上加上。

 

function Foo() {
      console.log("我是一个方法");
    }

    Foo.prototype.name = "我是Foo创造的实例共享的属性";

    const f1 = new Foo();
    const f2 = new Foo();

    console.log(f1.name);//我是Foo创造的实例共享的属性
    console.log(f2.name);//我是Foo创造的实例共享的属性

JavaScript原型链详解

5、构造函数也有__proto__

上面说所有对象都有__proto__ ,Foo是函数也是对象啊,所以Foo.__proto__是啥呢?

那就去找Foo的构造函数是谁呢,Foo是一个函数,拥有函数特有的方法和属性,创造的它的构造函数就是Function,这个js自带的的一个构造函数,它的Function.prototype给所有js中你创建的函数提供函数自带的一些公共方法和属性。

所以Foo.__proto__指向Funtion.prototype

6、构造函数的原型也有__proto__

Foo.prototype也是对象,所以它也有__proto__。

每当我们要找__proto__,就得找它的构造函数,Foo.prototype是个对象,纯对象,所以它的构造函数是Object,那么Object的原型就是Object.prototype。

Foo.prototype.__proto__指向Object.prototype

7、Object.prototype这个原型对象很特殊

ArrayStringFuntionObject这些构造函数都是函数,
都是Funtion构造函数的实例,
Array.__proto__String.__proto__Funtion.__proto__ Object.__proto__指向Funtion.prototype原型,
可以调用Funtion.prototype原型的一些公共方法,
例如都可以调用.name查看自己的函数名字。

Array.prototypeString.prototypeFuntion.prototype这些原型对象都是对象,
都是Object构造函数的实例,
Array.prototype.__proto__ String.prototype.__proto__Funtion.prototype.__proto__指向Object.prototype原型,
所以可以调用Object.prototype这个原型对象的公共方法,

Object.prototype有些特殊,它虽然是对象,但是并不是Object自己的实例,
Object.prototype.__proto__指向null,作为原型链的终点

8、总结

方法,也就是函数,才有prototype,就是方法的原型。
所以实例,一般都会有个对应的构造方法,也就是构造函数,实例的__proto__指向构造方法的原型。
js有很多自带的构造方法,例如ArrayStringFuntionObject,都是根据js一些对象类型分配的,他们的原型上提供了许多封装好的常用方法。
所有构造方法本身是函数,是Funtion这个js自带构造函数的实例。
除了Object.prototype,所有构造方法的原型本身是对象,是Object这个js自带构造函数的实例。
Object.prototype.__prototype指向null,作为原型链终点。

JavaScript原型链详解

到此这篇关于JavaScript原型链详解的文章就介绍到这了,更多相关JavaScript原型链内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
textContent在Firefox下与innerText等效的属性
May 12 Javascript
JavaScript 监听textarea中按键事件
Oct 08 Javascript
Javascript中的this绑定介绍
Sep 22 Javascript
基于jQuery.Validate验证库知识点的详解
Apr 26 Javascript
javascript中直接写php代码的方法
Jul 31 Javascript
angular.js分页代码的实例
Jul 27 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
Nov 01 Javascript
详解javascript获取url信息的常见方法
Dec 19 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
May 22 Javascript
详解ES6数组方法find()、findIndex()的总结
May 12 Javascript
vue 实现把路由单独分离出来
Aug 13 Javascript
vue实现动态给id赋值,点击事件获取当前点击的元素的id操作
Nov 09 Javascript
JavaScript组合继承详解
详细聊聊vue中组件的props属性
教你一步步实现一个简易promise
Nov 02 #Javascript
一定要知道的 25 个 Vue 技巧
原型和原型链 prototype和proto的区别详情
Nov 02 #Javascript
浅谈克隆 JavaScript
Nov 02 #Javascript
WebWorker 封装 JavaScript 沙箱详情
You might like
php+mysql分页代码详解
2008/03/27 PHP
PHP MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
2012/05/05 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
jquery JSON的解析方式示例介绍
2014/07/27 Javascript
jQuery弹层插件jquery.fancybox.js用法实例
2016/01/22 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
Ionic快速安装教程
2016/06/03 Javascript
老生常谈的跨域处理
2017/01/11 Javascript
vue2 前后端分离项目ajax跨域session问题解决方法
2017/04/27 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
2018/10/12 Javascript
Layui弹出层 加载 做编辑页面的方法
2019/09/16 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
介绍Python中的fabs()方法的使用
2015/05/14 Python
详解python上传文件和字符到PHP服务器
2017/11/24 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
2019/09/17 Python
超酷炫 CSS3垂直手风琴菜单
2016/06/28 HTML / CSS
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
高中运动会入场词
2014/02/14 职场文书
《走一步再走一步》教学反思
2014/02/15 职场文书
酒店开业庆典主持词
2014/03/21 职场文书
调研汇报材料范文
2014/08/17 职场文书
小学运动会演讲稿
2014/08/25 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
2014年材料员工作总结
2014/11/19 职场文书
2015年体育教师个人工作总结
2015/05/12 职场文书
学雷锋感言
2015/08/03 职场文书
SQL实现LeetCode(176.第二高薪水)
2021/08/04 MySQL
Python OpenCV超详细讲解基本功能
2022/04/02 Python