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 相关文章推荐
常用参考资料(手册)下载或者链接
Jul 22 Javascript
javascript 面向对象,实现namespace,class,继承,重载
Oct 29 Javascript
关于Jqzoom的使用心得 jquery放大镜效果插件
Apr 12 Javascript
理解Javascript_03_javascript全局观
Oct 11 Javascript
加载列表时jquery获取ul中第一个li的属性
Nov 02 Javascript
JS获取各种宽度、高度的简单介绍
Dec 19 Javascript
javascript中var的重要性分析
Feb 11 Javascript
Jquery遍历Json数据的方法
Apr 20 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
Dec 02 Javascript
JS定时器实现数值从0到10来回变化
Dec 09 Javascript
JavaScript设计模式之策略模式详解
Jun 09 Javascript
JS实现压缩上传图片base64长度功能
Dec 03 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学习之PHP表达式
2006/10/09 PHP
使用PHP 5.0创建图形的巧妙方法
2010/10/12 PHP
php实现快速排序的三种方法分享
2014/03/12 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
什么是PEAR?什么是PECL?PHP中两个容易混淆的概念解释
2015/07/01 PHP
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
javascript常见用法总结
2014/05/22 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
bootstrap table操作技巧分享
2017/02/15 Javascript
js 只比较时间大小的实例
2017/10/26 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
2017/12/07 Javascript
vue-cli+webpack项目 修改项目名称的方法
2018/02/28 Javascript
vue写一个组件
2018/04/09 Javascript
利用Bootstrap Multiselect实现下拉框多选功能
2019/04/08 Javascript
vue 中 命名视图的用法实例详解
2019/08/14 Javascript
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
python修改txt文件中的某一项方法
2018/12/29 Python
python selenium执行所有测试用例并生成报告的方法
2019/02/13 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
Python内置数据类型list各方法的性能测试过程解析
2020/01/07 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
python 利用toapi库自动生成api
2020/10/19 Python
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
大学生活学习的自我评价
2013/12/03 职场文书
单位成立周年感言
2014/01/26 职场文书
一分钟演讲稿
2014/04/30 职场文书
我的祖国演讲稿
2014/05/04 职场文书
施工安全标语
2014/06/07 职场文书
总账会计岗位职责
2015/04/02 职场文书
七年级写作指导之游记作文
2019/10/07 职场文书
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
2021/04/24 Python