浅谈JavaScript中的prototype

本文探讨了JavaScript中prototype的概念,解析其作为对象属性的作用与意义,包括如何通过构造函数创建对象时利用prototype实现属性共享,以及在实际开发中可能遇到的问题与解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先对于prototype呢,我之前的第一感觉就是,可以往里面添加属性和方法,然后该构造函数创建的对象就可以直接使用这些属性和方法


1.prototype是什么?
    首先它是一个任何对象都可以有的一个属性,因为就是一个属性名,和什么obj.name 啊  obj.age  是一样的,你可以用它来存储任何数据类型。
                var arr = [];
                arr.prototype = '666';
                console.log(arr.prototype);  //'666'

                arr.prototype = 666;
                console.log(arr.prototype); //666

                arr.prototype = [];
                console.log(Object.prototype.toString.call(arr.prototype));  //[object Array]

                arr.prototype = function(){};
                console.log(Object.prototype.toString.call(arr.prototype)); //[object Function]

                arr.prototype = {};
                console.log(arr.prototype); //[object Object]

但是如果实际开发中这样做的话,并没有什么好处,可能你的代码一多,还会让看你代码的人思维混乱。

2.prototype有什么用?
    1)只有该对象是构造函数的时候才有用(其实不一定是构造函数,普通函数也可以。不过依旧没有实战意义,因为返回的是空对象),因为当用构造函数创建一个实体对象(实例化)的时候才有用,构造函数会让实体对象的__proto__指向  构造函数的prototype.然后使这个对象可以去调用这个 原型 里面的属性。(好像有点抽象)【这个具体的机制我目前还没有弄明白,这种东西可能在源码里面吧 qwq 】

打个比方:假如说人类是一个构造函数,你,就是一个对象。想想是否你一生下来就会哭,这个好像没有人教吧。


    2)这个构造函数的 prototype 的属性值 一定要是对象吗? 不一定。    你可以指定成任意数据类型,但还是没有实际的意义。而且实体对象的 __proto__依旧指向的是一个对象。

如果没有主动的对构造函数的 prototype 属性 进行赋值的话,默认是一个对象。


    3)只有prototype 的属性值为对象的时候,对于构造函数来讲,才有实际的意义。比如放一些公用的属性。

如果中国人是一个构造函数,每一个中国人就是一个对象,当老外见到你的时候问:嘿,你是中国人吗?
然后你回答是。然后那个外国人的脑子里面就会浮现 噢,东方人 、普通话、北京、有钱 、亡者农药。这些属性你全有吗?可能没有,但是这些属性是外国人共同有的一个印象,像这种东西一般来说是放在prototype里面的。


4)它可以存放一些公用的属性,那就意味这你可以对其进行修改,添加或者修改属性。这个没有什么好说的。

5)然后我们在回到prototype这个属性上来,既然这是一个属性,那么也就意味着它可以被修改,而实际上prototype所获得的并不是某一个对象,而是这个对象的指针,就像你可以用数字1,2,3,4在数组中找到相应的元素一样。

6)修改prototype属性会带来一些问题:

    a)首先它的constructor属性指向可能会混乱

解决办法:手动的修改constructor的指向

    b)原来拓展的属性全都不见了,这是肯定的,因为你连对象都换了,怎么可能还存在原来的属性。

    c)在修改prototype之前创建的对象,用不了修改prototype后 原型里面的属性。上面说过,在构造函数创建对象的时候,会将prototype的指针 赋给  对象的__proto__属性.但是__proto__属性不是动态的(至少我是这么理解的),不会自动的去修改它本身的指针

解决办法: 你可以手动的去修改_ proto _


总的来说,单个构造函数的prototype实战性不大,最多也就是让同一类对象在内存占用上更少一点。

未完,待续。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值