清楚搞懂JS原型对象和原型链

本文详细介绍了JavaScript中的构造函数、实例对象、原型对象和原型链的概念。通过实例展示了如何创建构造函数及实例对象,并探讨了如何通过原型对象为所有实例添加共享属性。此外,解释了原型链的工作原理,当访问对象属性时,如何沿着原型链查找直至找到属性或到达原型链顶端。最后,强调了避免直接操作实例对象的_proto_属性的重要性。
摘要由CSDN通过智能技术生成

目录

一 构造函数和实例对象

二 原型对象

三 原型链


一 构造函数和实例对象

要想理解原型必须要从构造函数和实例对象说起:

        //构造函数
        function Person(name,age){
            this.name = name
            this.age = age
        }
        //创建一个实例对象
        const P = new Person('小明','18')
        

上面我们创建了一个构造函数,并且还使用这个构造函数创建了其实例对象,下面我们来打印这个实例对象,看看他是什么鬼

对于上面的结果想必大家并不意外,那问题来了,若我们使用这个构造函数创建了几十个实例对象,现在我们如何不改动构造函数给所有的对象都添加一个属性sex ?所以设计者针对实例对象的公共属性和方法设计出了原型对象。

二 原型对象

我们继续将上的实例对象的打印结果展开

        

 我们可以看到在实例对象p上有一个prototype属性,它所指向的就是实例对象p构造函数原型对象,并且在其内部还有一个construcor属性,它所指向的就是实例对象p构造函数,一顿巧妙的操作将实例对象,构造函数和原型对象联系了起来。我们给出一段代码和打印结果:

​
        // 构造函数
        function Person(name,age){
            this.name = name
            this.age = age
        }
        // 在原型对象上添加属性sex
        Person.prototype.sex = 'male'
        const p = new Person('小明',18)
        const pp = new Person('校小张',20)
        console.log(p,p.sex);
        console.log(pp,pp.sex);

​

 

我们很清楚的看到在p和pp两个实例对象prototype上都有male的属性,并且都可以读到sex属性的值。

三 原型链

理解了原型对象那理解起原型链就很简单了,先给出一段代码再做讲解

        // 构造函数
        function Person(name,age){
            this.name = name
            this.age = age
        }
        // 在原型对象上添加属性sex
        Person.prototype.getName = function(){
            console.log(this.name);
        }
        const p = new Person('小明',18)
        console.log(p.hasOwnProperty('getName') ) // -------false
        p.getName() //-------小明

        console.log(p);

   可以看到我们在Person的原型对象上增加了一个getName函数,用hasOwnProperty判断p本身并没有这个函数,但是后面p仍然使用了这个函数并且没有任何错误警告,这是为什么呢?我们继续把打印结果展开,答案就在这里

 在原型链_proto_是不可或缺的存在,它指向的就是p的构造函数原型对象,当我们访问对象的某个属性的时候若在其本身没有此属性就会通过_proto_继续向上找直至找到属性或者_proto_为null,像这样一层一层向上查找的链式结构就叫做原型链。需要注意的是我们最好不去操作_proto_,因为一旦在某个实例对象中对_proto_里的属性进行修改,其余所有使用这个构造函数插件的实例对象都会相应修改。

以上都是本人在学习过程中对原型对象和原型链的一点理解,有错误或者不完全的地方请大家积极指出,祝大家学业进步,工作顺利!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值