千家信息网

JavaScript原型和原型链是什么意思

发表于:2024-10-27 作者:千家信息网编辑
千家信息网最后更新 2024年10月27日,小编给大家分享一下JavaScript原型和原型链是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、原型、原型链
千家信息网最后更新 2024年10月27日JavaScript原型和原型链是什么意思

小编给大家分享一下JavaScript原型和原型链是什么意思,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、原型、原型链相等关系理解

首先我们要清楚明白两个概念:

js分为函数对象和普通对象,每个对象都有__proto__属性,但是只有函数对象才有prototype属性
ObjectFunction都是js内置的函数, 类似的还有我们常用到的ArrayRegExpDateBooleanNumberString

这两个概念大家跟我一起读三遍并记住,后面会用到

那么__proto__prototype到底是什么,两个概念理解它们

  • 属性__proto__是一个对象,它有两个属性,constructor__proto__

  • 原型对象prototype有一个默认的constructor属性,用于记录实例是由哪个构造函数创建;

这两个概念大家跟我一起读三遍并记住,后面会用到

有以下构造函数Person,他的原型上有所属国属性motherland='China'

 function Person(name, age){     this.name = name;    this.age = age; }  Person.prototype.motherland = 'China'

通过new Person()创建的person01实例

 let person01 = new Person('小明', 18);

js之父在设计js原型、原型链的时候遵从以下两个准则

 Person.prototype.constructor == Person // **准则1:原型对象(即Person.prototype)的constructor指向构造函数本身** person01.__proto__ == Person.prototype // **准则2:实例(即person01)的__proto__和原型对象指向同一个地方**

这两个准则大家跟我一起读三遍并记住,后面会用到

记住以上四个概念两个准则,任何原型链相等判断都能判断正确;

大家可以对照上图,看看自己概念准则是否弄清楚了,一定要对照上图哦

// 从上方 function Foo() 开始分析这一张经典之图function Foo()let f1 = new Foo();let f2 = new Foo();f1.__proto__ = Foo.prototype; // 准则2f2.__proto__ = Foo.prototype; // 准则2Foo.prototype.__proto__ = Object.prototype; // 准则2 (Foo.prototype本质也是普通对象,可适用准则2)Object.prototype.__proto__ = null; // 原型链到此停止Foo.prototype.constructor = Foo; // 准则1Foo.__proto__ = Function.prototype; // 准则2Function.prototype.__proto__  = Object.prototype; //  准则2 (Function.prototype本质也是普通对象,可适用准则2)Object.prototype.__proto__ = null; // 原型链到此停止// **此处注意Foo 和 Function的区别, Foo是 Function的实例**// 从中间 Function Object()开始分析这一张经典之图Function Object()let o1 = new  Object();let o2 = new  Object();o1.__proto__ = Object.prototype; // 准则2o2.__proto__ = Object.prototype; // 准则2Object.prototype.__proto__ = null; // 原型链到此停止Object.prototype.constructor = Object; // 准则1Object.__proto__ = Function.prototype // 准则2 (Object本质也是函数);// 此处有点绕,Object本质是函数,Function本质是对象Function.prototype.__proto__ =  Object.prototype; // 准则2 (Function.prototype本质也是普通对象,可适用准则2)Object.prototype.__proto__ = null; // 原型链到此停止// 从下方 Function Function()开始分析这一张经典之图Function Function()Function.__proto__ = Function.prototype // 准则2Function.prototype.constructor = Function; // 准则1

由此可以得出结论: 除了Object的原型对象(Object.prototype)的__proto__指向null,其他内置函数对象的原型对象(例如:Array.prototype)和自定义构造函数的 __proto__都指向Object.prototype, 因为原型对象本身是普通对象。 即:

Object.prototype.__proto__ = null;Array.prototype.__proto__ = Object.prototype;Foo.prototype.__proto__  = Object.prototype;

二:原型、原型链的意思何在

理解了这些相等关系之后,我们思考,原型、原型链的意思何在?原型对象的作用,是用来存放实例中共有的那部份属性、方法,可以大大减少内存消耗。

用我们文章开始的Person构造函数和person01实例举例说:

console.log(person01)

打印person01, 他有自己属性 name = '小明',age = 18; 同时通过原型链关系,他有属性motherland = 'China';

我们再创建person2实例

let person02 = new Person('小花', 20);console.log(person02)

打印person02, 他有自己属性 name = '小花',age = 20; 同时通过原型链关系,他有属性motherland = 'China'; 看出来了没有,原型对象存放了person01person02共有的属性所属国motherland = 'China'. 我们不用在每个实例上添加motherland 属性,而是将这一属性存在他们的构造函数原型对象上,对于人类Person这样的构造函数。相同的属性、方法还有很多很多,比如我们是黑头发,我们都有吃,睡这样一个方法,当相同的属性、方法越多,原型、原型链的意义越大。 那我们可以这样操作

Person.prototype.hairColor = 'black';Person.prototype.eat = function(){    console.log('We usually eat three meals a day.')}console.log(person01)console.log(person02)

此时我们再打印person01person02,我们惊喜的发现,他们有了属性hairColoreat方法;实例们动态的获得了Person构造函数之后添加的属性、方法,这是就是原型、原型链的意义所在!可以动态获取,可以节省内存。

另外我们还要注意:如果person01将头发染成了黄色,那么hairColor会是什么呢?

person01,hairColor = 'yellow';console.log(person01)console.log(person02)

可以看到,person01hairColor = 'yellow', 而person02hairColor = 'black'; 实例对象重写原型上继承的属相、方法,相当于"属性覆盖、属性屏蔽",这一操作不会改变原型上的属性、方法,自然也不会改变由统一构造函数创建的其他实例,只有修改原型对象上的属性、方法,才能改变其他实例通过原型链获得的属性、方法。

以上是"JavaScript原型和原型链是什么意思"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

原型 属性 准则 对象 函数 实例 方法 两个 本质 概念 普通 意思 指向 篇文章 经典 分析 相同 上图 内存 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 特斯拉中国的数据库已经建成了吗 我的世界服务器等价交换定价指令 维护网络安全对政府有好处吗 碳排放数据库设计 实验室管理系统视图数据库 宝鸡市佳龙网络技术 数据库同步 kettle 服务器隐身套路 软件开发专员任职要求 网络安全三定指什么 网络安全小知识手抄报8开纸 软件开发工具最重要的性能 数据库自动增长的字段 数据库系统征集数据 中国联通鲲鹏服务器终端 知网和维普哪个的数据库更大 违反网络安全法的app 网络技术咨询服务合同范本 计算机网络技术和文秘哪个好 关于网络安全的英语博文 网络安全测评中级工程师职责 丹东威联软件开发 有关网络安全教育的简报 织梦的数据库在 excel 软件开发需求 指令连接数据库 北京潮咖互联网科技有限公司 网络安全应具备的条件是什么 南京米云互联网科技有限公司 邯郸办公系统软件开发价位
0