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 相关文章推荐
Jquey拖拽控件Draggable使用方法(asp.net环境)
Sep 28 Javascript
js中的referrer返回上一页使用介绍
Sep 26 Javascript
图片动画横条广告带上下滚动的JS代码
Oct 25 Javascript
jquery对象和javascript对象即DOM对象相互转换
Aug 07 Javascript
javascript去除空格方法小结
May 21 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
Jul 12 Javascript
js 实现一些跨浏览器的事件方法详解及实例
Oct 27 Javascript
js图片延迟加载(Lazyload)三种实现方式
Mar 01 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
Mar 23 jQuery
基于JavaScript实现的折半查找算法示例
Apr 14 Javascript
如何在 JavaScript 中更好地利用数组
Sep 27 Javascript
vue相关配置文件详解及多环境配置详细步骤
May 19 Javascript
JavaScript组合继承详解
详细聊聊vue中组件的props属性
教你一步步实现一个简易promise
Nov 02 #Javascript
一定要知道的 25 个 Vue 技巧
原型和原型链 prototype和proto的区别详情
Nov 02 #Javascript
浅谈克隆 JavaScript
Nov 02 #Javascript
WebWorker 封装 JavaScript 沙箱详情
You might like
mysql 的 like 问题,超强毕杀记!!!
2007/01/18 PHP
iis下php mail函数的sendmail配置方法(官方推荐)
2012/04/25 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
jquery的Theme和Theme Switcher使用小结
2010/09/08 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
jquery 获取表单元素里面的值示例代码
2013/07/28 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
jQuery简单注册和禁用全局事件的方法
2016/07/25 Javascript
JavaScript使用键盘输入控制实现数字验证功能
2016/08/19 Javascript
使用Vue.js创建一个时间跟踪的单页应用
2016/11/28 Javascript
JS获取多维数组中相同键的值实现方法示例
2017/01/06 Javascript
Django与Vue语法的冲突问题完美解决方法
2017/12/14 Javascript
vue3.0 CLI - 2.2 - 组件 home.vue 的初步改造
2018/09/14 Javascript
通过javascript实现扫雷游戏代码实例
2020/02/09 Javascript
基于vue的tab-list类目切换商品列表组件的示例代码
2020/02/14 Javascript
vue+iview框架实现左侧动态菜单功能的示例代码
2020/07/23 Javascript
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
[03:57]2016完美“圣”典风云人物:rOtk专访
2016/12/09 DOTA
详解Python中time()方法的使用的教程
2015/05/22 Python
python开发中module模块用法实例分析
2015/11/12 Python
Python之两种模式的生产者消费者模型详解
2018/10/26 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
Python 多维List创建的问题小结
2019/01/18 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
Python tkinter常用操作代码实例
2020/01/03 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
促销活动总结范文
2014/04/30 职场文书
给市场的环保建议书
2014/05/14 职场文书
服务口号大全
2014/06/11 职场文书
入党积极分子个人总结
2015/03/02 职场文书