关于原型和原型链的整理学习
admin
2024-05-22 01:22:45
0

        关于原型和原型链是很多人学习或面试时遇到的问题,可能部分不懂,部分懂但不会说,下面关于原型和原型链进行简单的整理总结,希望可以帮助到大家。

一、JS中的原型和原型链

1、原型说明

        所有的引用类型(数组、函数、对象)可以自由扩展属性(除null以外)。

        所有的引用类型都有一个’_ _ proto_ _'属性(也叫隐式原型,它是一个普通的对象)。

        所有的函数都有一个’prototype’属性(这也叫显式原型,它也是一个普通的对象)。

        所有引用类型,它的’_ _ proto_ _'属性指向它的构造函数的’prototype’属性。

        当试图得到一个对象的属性时,如果这个对象本身不存在这个属性,那么就会去它的’_ _ proto_ _'属性(也就是它的构造函数的’prototype’属性)中去寻找。

2、什么是构造函数

        对于上面的信息,唯一有疑问的问题可能就是什么是构造函数?

        构造函数:在JavaScript中,用new关键字来调用的函数,称为构造函数,构造函数一般首字母大写。

        构造函数的作用:对重复代码进行处理,通过构造函数创建对象。提高代码复用率。

        构造函数的执行过程:

                1.当以 new 关键字调用时,会创建一个新的内存空间,标记为 Animal 的实例。

                2.函数体内部的 this 指向该内存,可以通过this.xxx=函数接收的参数,进行赋值

                3.执行函数体内的代码,给this添加属性等于给实例添加属性

                4.默认返回this,由于函数体内部的this指向新创建的内存空间,默认返回this相当于默认返回了该内存空间

        构造函数的返回值:如果返回基本类型,最终还是返回this。如果返回复杂数据类型,则最终返回该对象。

3、原型举例说明

//创建一个Blogger函数
function Blogger(name,age){this.name=name,this.age=age
}
//函数有一个prototype属性是一个普通对象
Blogger.prototype.speak=function(){console.log('大家好!');
}
//通过构造函数创建一个实例对象
const xc = new Blogger('勇敢小陈','25')
console.log(xc);//{ name: '勇敢小陈', age: '25' }
console.log(xc.name);//勇敢小陈
//引用类型的__proto__属性指向他的构造函数的prototype属性
console.log(xc.__proto__===Blogger.prototype);//true
//当试图得到一个对象的属性时,如果这个对象本身不存在这个属性,那么就会去他的__proto__属性上去找也就是构造函数的prototype属性中寻找
xc.speak()//大家好!
//找不到的时候报错undefined
console.log(xc.speak1());//xc.speak1 is not a function

        应该可以理解哈,如果有问题欢迎留言。

        关于为什么要使用原型呢?很简单,为了提交代码的复用率,如果我们要创建多个博主的信息,不能每次都去创建一个对象,然后定义其name、age、speak,所以通过构造函数和原型可以共用构造函数的方法,通过构造函数创建多个对象。

4、原型链

        原型链其实也不难理解,但首先要理解什么是原型,如果对上面还不太懂得话,可以先去看下上面。

示例代码:

//创建一个Blogger函数
function Blogger(name,age){this.name=name,this.age=age
}
//函数有一个prototype属性是一个普通对象
Blogger.prototype.speak=function(){console.log('大家好!');
}
//通过构造函数创建一个实例对象
const xc = new Blogger('勇敢小陈','25')
console.log(xc);//{ name: '勇敢小陈', age: '25' }
console.log(xc.name);//勇敢小陈
//引用类型的__proto__属性指向他的构造函数的prototype属性
console.log(xc.__proto__===Blogger.prototype);//true
//当试图得到一个对象的属性时,如果这个对象本身不存在这个属性,那么就会去他的__proto__属性上去找也就是构造函数的prototype属性中寻找
xc.speak()//大家好!
//找不到的时候报错undefined
// console.log(xc.speak1());//xc.speak1 is not a function
//当试图得到一个对象的属性时,如果这个对象本身不存在这个属性,那么就会去它构造函数的’prototype’属性中去寻找。那又因为’prototype’属性是一个对象,所以它也有一个’_ _ proto_ _'属性。
console.log(Blogger.prototype.__proto__===Object.prototype);//true
console.log(Object.prototype);//{}
console.log(Object.prototype.__proto__===null);//true

 这里写图片描述

这是找的网上的图,我自己画的图太丑了,哈哈哈。然后图中的Foo就是我们代码中的Blogger。

然后一起梳理一下一个图(图好像有问题,配合下面文字进行理解,以文字为准):

        首先我们通过new Blogger创建了xc,然后xc的__proto__指向Blogger.prototype,而Blogger.prototype又是一个对象,对象通过构造函数Object创建,也就是Blogger.prototype.__proto__执行Object.prototype,然后Object又是一个对象,他也有__proto__指向其构造函数的prototype,但Object是原始对象,没有构造函数,也就是null,也就是Object.__proto__===null。总而言之,当你获取对象是属性时,当他找不到时,会通过他的__proto__找他的构造函数有没有,他的构造函数也是对象,如果没有又会继续按照__proto__进行寻找知道找到Object,如果没有则报错XXX是undefined。

这样的链式调用成为原型链。

5、总结

        有问题欢迎留言,然后我们会进行补充,或者文章改错。

相关内容

热门资讯

免费!增城首个!拍照打卡、遛娃... 好消息! 增城区首个立交上盖公园 新塘镇公园上城海贝公园 二期建设工程正在稳步推进 预计 2026 ...
泰国旅游咋就不香了?中国人少了... 嘿,您知道吗?现在去泰国的人啊,那真是少得可怜,就像大夏天里的冰棍儿,化得没剩多少了。 2025 年...
云南最新通知!这类导游被吊证后... 近日,云南省人民政府办公厅发布通知称,8月12日起,《云南省进一步加强旅游市场诚信建设10条措施》(...
重庆洪崖洞拉客拍照纠纷 记者实... 封面新闻记者 马嘉豪 黄晓庆 实习生 张彤睿 7月12日,封面新闻报道了重庆洪崖洞一商户在景区强行揽...
“空地联程 畅游德天” 南宁吴... 7月13日,在南宁吴圩机场举行了以“空地联程·畅游德天”为主题的机场往返德天跨国瀑布/明仕田园景区的...
恶魔在身边,这部片大慨是讲什么... 恶魔在身边,这部片大慨是讲什么,大结局是怎么样的,可以在哪里看到这就是中国结啊。打字很难说的清楚。首...
芭比梦幻屋冒险旅程的主题曲叫什... 芭比梦幻屋冒险旅程的主题曲叫什么名,可爱的芭比嘟嘟嘟。这就是它的主题曲名字。翻译过来就这么好听。你听...
魏子玉是什么人 魏子玉是什么人魏子玉是什么人魏东亭的孙子
男孩2015年出生,姓李可起名... 男孩2015年出生,姓李可起名按辈份,中间带吉子不知起什么名好文澜:文章的波澜。适用于男孩和女孩取名...
好人定义是什么? 好人定义是什么?我理解的好人,是大方向大原则方面的好人。 虽然不以恶小而为之的多半是好人, 但要是有...
如何评价《道士下山》这部电影,... 如何评价《道士下山》这部电影,我是完全没看懂不谙世事的小道士,以最朴实的理由踏入红尘———闹粮荒。最...
作为职场新人,被同事欺负了怎么... 作为职场新人,被同事欺负了怎么办呢?第一点弄清楚他为什么欺负你;第二点如果他对你有误会,可能只是表达...
柳毅传作者简介 柳毅传作者简介李朝威〔唐〕(约公元七五九年前后在世)字不详,陇西人。生卒年均不祥,约唐肃宗乾元中前后...
只是哪个动漫里的人物? 只是哪个动漫里的人物?是我们的存在吧,不过剧情些许虐心吧,不要被这张图的美好景象给骗了我们的存在这动...
寻一小说:情景和召唤红警差不多... 寻一小说:情景和召唤红警差不多的。内容呢?我看过本《异界虫族》到是和召唤红警差不多,主角跑到异界召唤...
死神TV原创内容有些什么? 死神TV原创内容有些什么?魂狩篇(064-091,原创剧情篇) 魂狩·尸魂界强袭篇(092-109,...
你会跟年龄差七岁的人在一起嘛 你会跟年龄差七岁的人在一起嘛如果我很喜欢这个人对方也喜欢我,我会跟年龄差七岁的人在一起,只要相爱,那...
一个完全不懂爱情的女孩子 要怎... 一个完全不懂爱情的女孩子 要怎样才能看出她喜欢上了一个人感觉是种很微妙的东西,不知不觉当中你或许就已...
军训是什么? 军训是什么?军训是学校开学的 必备课 ,有锈的锻炼同学们的意志 让他们积极乐观 学习 乐于助人的精神
想写小说,可文采一般,问怎样才... 想写小说,可文采一般,问怎样才能提高自己的文采推荐一些可提高文笔的书看,和写小说的注意事项多看一些文...