日常复习之一文搞懂JavaScript原型链

2023-05-29 0 608

我们讷西县蓝本链科学知识的单厢有这那哥。

日常复习之一文搞懂JavaScript原型链

1) 蓝本第一类与蓝本特性

prototype:蓝本第一类,表达式在新闻稿的这时候手动建立的几块储存地区,用作储存公用的共享资源特性和形式__ __proto__: 蓝本特性,每一个示例第一类在建立的这时候单厢有两个蓝本特性__proto__,对准缺省的prototype
日常复习之一文搞懂JavaScript原型链
日常复习之一文搞懂JavaScript原型链

因此能窥见缺省的prototype和示例第一类的__proto__是true对准同一地方性。

甚么是构造函数呢?是new的表达式因此第两个字母是要小写的表达式是缺省。

平常表述的表达式有下列三种形式

function aa(name,age){console.log(name,age)} aa(“张三”,19) var bb = function (name,age){console.log(name,age)} bb(“李四”22) const arrowFn = (name, age) => { console.log(`我是${name}, 我今年${age}岁`) } arrowFn(王五, 10)

其实这三种的本质都是一样的(只考虑表达式的新闻稿),都能使用new Function来声明,是的没错Function也是两个缺省。上面的写法等同于下面的写法

const aa = new Function(name,age){console.log(name,age)} aa(“张三”,19) const bb = new Function(name,age){console.log(name,age)} bb(“李四”22) const arrowFn = new Function(name,age){console.log(`我是${name}, 我今年${age}岁`))} arrowFn(王五, 10)

因此这里的aa,bb,arrowFn其实是new Function(){}缺省的示例,举两个例子

日常复习之一文搞懂JavaScript原型链

第一类

咱们平常开发中,建立两个第一类,通常会用下列三种形式。

缺省建立第一类,他建立出来的第一类都是此Function缺省的示例,因此这里不讨论它字面量建立第一类new Object建立第一类Object.create建立第一类,建立出来的是两个空蓝本的第一类,这里不讨论它//1.字面量建立 var obj1 = { //特性 “name”:“如花”, “age”:18, “sex”:“男”, //形式 “skill”:function(){ console.log(“抠脚”); } } console.log(obj1); //问题:代码冗余,适合建立单个第一类 //2.示例示例(单例) var obj2 = new Object(); //建立两个空第一类 //添加特性 obj2.name = “连海龙”; obj2.sex = “男”, //添加形式 obj2.skill = function(){ console.log(“玩游戏”); } console.log(obj1); //问题:代码冗余,适合建立单个第一类 咱们来看看字面量建立第一类和new Object建立第一类两种形式, 其实字面量建立第一类的本质是new Object建立第一类 //3.工厂模式建立(普通表达式封装) function createObj(name,age,height){ //建立第一类 var obj = new Object(); //添加特性 obj.name = name; obj.age = age; obj.height = height; //添加形式 obj.skill = function(){ console.log(); } //返回建立好的第一类 return obj; } //示例化第一类 var obj1 = createObj(“吴亦凡”,65,179); console.log(obj1); var obj2 = createObj(“蔡徐坤”,30,182); console.log(obj2); var obj3 = createObj(“旺财”,2,30); console.log(obj3); //问题:解决代码冗余的问题,识别不明,无法判断第一类的类型 console.log(typeof obj2,typeof obj3); //object object console.log(obj3 instanceof Object); //true 判断示例第一类是否由 后面的这个第一类建立 //4.新闻稿缺省 function Student(name, age, sex) { //1.隐式的建立了两个空第一类,让this对准这个空第一类 //this = new Object(); //2.执行缺省中代码(添加特性和形式) //添加特性 this.name = name; this.age = age;this.sex = sex; //添加形式 this.study = function () { console.log(“good good study,day day up!!!,好好学习,天天自闭”); } //4.隐式的返回建立好的第一类 //return this } var s2 = new Student(“曾庆文”,18,“女”); console.log(s2); // {name: “曾庆文”, age: 18, sex: “女”, study: ƒ} console.log(s2 instanceof Student); //true //.示例化第一类 var s1 = new Student(“李华”,10,“男”); var s2 = new Student(“曾庆文”,18,“女”); //问题:解决了识别不明的问题,浪费内存 console.log(s1.study == s2.study);//false 比较的是地址 // new 操作符的作用 1.隐式的建立了两个空第一类,让this对准这个空第一类 2.执行缺省中代码(添加特性和形式) 3.让建立的示例第一类的__proto__对准缺省的prototype4.隐式的返回建立好的第一类
日常复习之一文搞懂JavaScript原型链

蓝本第一类,表达式在新闻稿的这时候手动建立的几块储存地区,用作储存公用的共享资源特性和形式

Function和Object

上面咱们常说

表达式是Function缺省的示例第一类是Object缺省的示例

那Function缺省和Object缺省他们两个又是谁的示例呢?

function Object()其实也是个表达式,因此他是Function缺省的示例function Function()其实也是个表达式,因此他也是Function缺省的示例,没错,他是他自己本身的示例

咱们能试验一下就知道了

console.log(Function.prototype === Object.__proto__) // true console.log(Function.prototype === Function.__proto__) // true

constructor

constructor和prototype是成对的,你对准我,我对准你。举个例子,如果你是我老婆,那我肯定是你的老公。

function fn() {} console.log(fn.prototype) // {constructor: fn} console.log(fn.prototype.constructor === fn) // true

蓝本链

Person.prototype 和 Function.prototype

讨论蓝本链之前,咱们先来聊聊这两个东西

Person.prototype,它是缺省Person的蓝本第一类Function.prototype,他是缺省Function的蓝本第一类

都说了蓝本对象,蓝本第一类,能知道其实这两个本质都是第一类

那既然是第一类,本质肯定都是通过new Object()来建立的。既然是通过new Object()建立的,那就说明Person.prototype 和 Function.prototype都是缺省Object的示例。也就说明了Person.prototype 和 Function.prototype他们两的__proto__都对准Object.prototype

咱们能验证一下

function Person(){} console.log(Person.prototype.__proto__ === Object.prototype) // true console.log(Function.prototype.__proto__ === Object.prototype) // true 复制代码
日常复习之一文搞懂JavaScript原型链

甚么是蓝本链?

甚么是蓝本链呢?其实俗话说是:__proto__的路径就叫蓝本链

日常复习之一文搞懂JavaScript原型链

蓝本链终点

上面咱们看到,三条蓝本链结尾都是Object.prototype,那是不是说明了Object.prototype是蓝本链的终点呢?其实不是的,Object.prototype其实也有__proto__,对准null,那才是蓝本链的终点

至此,整个蓝本示意图就画完啦!!!

日常复习之一文搞懂JavaScript原型链

蓝本继承

说到蓝本,就不得不说补充一下蓝本继承这个科学知识点了,蓝本继承是,示例能使用缺省上的prototype中的形式

function Person(name) { // 缺省 this.name = name } Person.prototype.sayName = function() { // 往蓝本第一类添加形式 console.log(this.name) } const person = new Person(林三心) // 示例 // 使用缺省的prototype中的形式person.sayName()// 林三心 复制代码
日常复习之一文搞懂JavaScript原型链

instanceof

使用形式

A instanceof B 复制代码

作用:判断B的prototype是否在A的蓝本链上

例子

function Person(name) { // 缺省 this.name = name } const person = new Person(林三心) // 示例 console.log(Person instanceof Function) // true console.log(Person instanceof Object) // true console.log(person instanceof Person) // true console.log(person instanceof Object) // true

最后:记住一句话, 万物皆有__proto__,只有function才会有prototype

参考文章 链接:

https://juejin.cn/post/7007416743215759373

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务