千家信息网

javascript的原型和原型链是什么

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,小编给大家分享一下javascript的原型和原型链是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一,函数对象所有引
千家信息网最后更新 2025年11月07日javascript的原型和原型链是什么

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

一,函数对象

所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型)

所有函数拥有prototype属性(显式原型)(仅限函数)

原型对象:拥有prototype属性的对象,在定义函数时就被创建

二,构造函数

先复习下构造函数

//创建构造函数        function Word(words){            this.words = words;        }        Word.prototype = {            alert(){                alert(this.words);            }        }        //创建实例        var w = new Word("hello world");        w.print = function(){            console.log(this.words);            console.log(this);  //Person对象        }        w.print();  //hello world        w.alert();  //hello world

print()方法是w实例本身具有的方法,所以w.print()打印hello world;alert()不属于w实例的方法,属于构造函数的方法,w.alert()也会打印hello world,因为实例继承构造函数的方法。

实例w的隐式原型指向它构造函数的显式原型,指向的意思是恒等于

         w.__proto__ === Word.prototype

当调用某种方法或查找某种属性时,首先会在自身调用和查找,如果自身并没有该属性或方法,则会去它的__proto__属性中调用查找,也就是它构造函数的prototype中调用查找。所以很好理解实例继承构造函数的方法和属性:

w本身没有alert()方法,所以会去Word()的显式原型中调用alert(),即实例继承构造函数的方法。

三,原型和原型链

        Function.prototype.a = "a";        Object.prototype.b = "b";        function Person(){}        console.log(Person);    //function Person()        let p = new Person();        console.log(p);         //Person {} 对象        console.log(p.a);       //undefined        console.log(p.b);       //b

想一想p.a打印结果为undefined,p.b结果为b

解析:

p是Person()的实例,是一个Person对象,它拥有一个属性值__proto__,并且__proto__是一个对象,包含两个属性值constructor和__proto__

        console.log(p.__proto__.constructor);   //function Person(){}        console.log(p.__proto__.__proto__);     //对象{},拥有很多属性值

我们会发现p.__proto__.constructor返回的结果为构造函数本身,p.__proto__.__proto__有很多参数

我们调用constructor属性,p.___proto__.__proto__.constructor得到拥有多个参数的Object()函数,Person.prototype的隐式原型的constructor指向Object(),即Person.prototype.__proto__.constructor == Object()

从p.__proto__.constructor返回的结果为构造函数本身得到Person.prototype.constructor == Person()所以p.___proto__.__proto__== Object.prototype

所以p.b打印结果为b,p没有b属性,会一直通过__proto__向上查找,最后当查找到Object.prototype时找到,最后打印出b,向上查找过程中,得到的是Object.prototype,而不是Function.prototype,找不到a属性,所以结果为undefined,这就是原型链,通过__proto__向上进行查找,最终到null结束

        console.log(p.__proto__.__proto__.__proto__);   //null        console.log(Object.prototype.__proto__);        //null

大家理解刚才的过程,相信下面这些应该也都明白

        //Function        function Function(){}        console.log(Function);  //Function()        console.log(Function.prototype.constructor);    //Function()        console.log(Function.prototype.__proto__);      //Object.prototype        console.log(Function.prototype.__proto__.__proto__);    //NULL        console.log(Function.prototype.__proto__.constructor);  //Object()        console.log(Function.prototype.__proto__ === Object.prototype); //true

总结:

1.查找属性,如果本身没有,则会去__proto__中查找,也就是构造函数的显式原型中查找,如果构造函数中也没有该属性,因为构造函数也是对象,也有__proto__,那么会去它的显式原型中查找,一直到null,如果没有则返回undefined

2.p.__proto__.constructor == function Person(){}

3.p.___proto__.__proto__== Object.prototype

4.p.___proto__.__proto__.__proto__== Object.prototype.__proto__ == null

5.通过__proto__形成原型链而非protrotype

最后附上一张图,大家阅读完之后,看图应该可以很容易理解

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

函数 原型 属性 对象 方法 实例 结果 指向 篇文章 p.b 也就是 内容 参数 过程 p.a 不怎么 两个 多个 大部分 就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 医院基本统计指标数据库 服务器远程桌面灰色 全国网络安全知识教育 江苏媒体软件开发预算 软件开发外包公司技术 网络安全技术及应用第四版pdf 幼儿园网络安全演练步骤 软件开发质量提升方案 济南熙红网络技术有限公司 公众号支付软件开发 网络安全风险评估算法 win服务器网卡主备模式 网络安全的图书分类号 校园网络安全的三条标语 聊城分销软件开发哪家做的好 靠谱的app软件开发公司 mysql数据库处理千万 富士通服务器阵列卡驱动 组服务器赚钱 深圳市网络安全法 现在腾讯云服务器能架设多少ip 交换机与服务器连接用什么光模块 软件开发质量提升方案 佛山酒店软件开发咨询 软件开发为什么要维护费用 网络安全设备怎么部署 中学生网络安全应该怎么做 大公司网络安全工程师年薪 御龙在天登录服务器总是断开 我的世界网易服务器公会踢人
0