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 相关文章推荐
漂亮的jquery提示效果(仿腾讯弹出层)
Feb 05 Javascript
JavaScript实现定时隐藏与显示图片的方法
Aug 06 Javascript
浅谈JavaScript中的string拥有方法的原因
Aug 28 Javascript
js鼠标点击图片切换效果实现代码
Nov 19 Javascript
JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)
May 20 Javascript
EasyUI Pagination 分页的两种做法小结
Jul 09 Javascript
AngularJS实现路由实例
Feb 12 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
Sep 14 Javascript
JS实现的A*寻路算法详解
Dec 14 Javascript
vue实现移动端省市区选择
Sep 27 Javascript
解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)
Jul 21 Javascript
Vue指令实现OutClick的示例
Nov 16 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图片验证码与缩略图
2010/11/01 PHP
php实现从上传文件创建缩略图的方法
2015/04/02 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
PHP获取用户访问IP地址的5种方法
2016/05/16 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
JS模拟自动点击的简单实例
2013/08/08 Javascript
用nodejs实现PHP的print_r函数代码
2014/03/14 NodeJs
js实现鼠标滑过文字链接色彩变化的效果
2015/05/06 Javascript
详解nodeJS之路径PATH模块
2017/05/31 NodeJs
jQuery实现checkbox的简单操作
2017/11/18 jQuery
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
Vue自定义指令封装节流函数的方法示例
2018/07/09 Javascript
使用JS实现导航切换时高亮显示的示例讲解
2018/08/22 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
在elementui中Notification组件添加点击事件实例
2020/11/11 Javascript
[02:43]DOTA2英雄基础教程 德鲁伊
2014/01/13 DOTA
python 获取文件列表(或是目录例表)
2009/03/25 Python
Python3.2中的字符串函数学习总结
2015/04/23 Python
python虚拟环境virtualenv的使用教程
2017/10/20 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
Python 如何批量更新已安装的库
2020/05/26 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
前端水印的简单实现代码示例
2020/12/02 HTML / CSS
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
几个Linux面试题笔试题
2016/08/01 面试题
门卫工作岗位职责
2013/12/17 职场文书
党委工作总结2015
2015/04/27 职场文书
运动会加油稿50字
2015/07/21 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书
2019暑期安全倡议书!
2019/06/27 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
电脑只能进入安全模式无法正常启动的解决办法
2022/04/08 数码科技