原型对象是什么,__proto__跟prototype的区别

 废话少说,上一个简单代码:

function f(){
	this.thisPro='这是我的属性';
}
f.prototype.protoPro='这是原型对象的属性';
let ins1=new f();
let ins2=new f();
console.log(ins1.thisPro);//这是我的属性
ins1.thisPro='这是我ins1的属性';
console.log(ins1.thisPro);//这是我ins1的属性
console.log(ins2.thisPro);//这是我的属性
ins2.thisPro='这是我ins2的属性';
console.log(ins2.thisPro);//这是我ins2的属性
console.log(f.prototype.protoPro);//这是原型对象的属性
ins1.__proto__.protoPro='ins1到此一游';
console.log(f.prototype.protoPro);//ins1到此一游
ins2.__proto__.protoPro='ins2到此一游';
console.log(f.prototype.protoPro);//ins2到此一游
//到这里,ins1还没有自己的protoPro属性,如果访问这个属性就会自动到原型对象上面去找。
console.log(ins1.protoPro);//"ins2到此一游",注意这时候这个属性依旧是属于原型对象的
ins1.protoPro="aaaaaaaaa";//跟上面不一样了,这里相当于为ins1新创建了一个自身的属性protoPro,以后再ins1.protoPro就会返回这个自身属性的值,要找原型那个protoPro就只能通过ins1.__proto__或者f.prototype去找。

总的来说,这俩都是用来访问原型对象的,原型对象可以通过用来new的那个function即构造函数的prototype去访问,如果把原型对象当作一个类,这样去访问原型对象的属性跟方法,就有点像其他语言的static,但是多了一项很厉害的,就是可以通过实例的__proto__去访问这个原型对象,而且在实例对象找不到某个属性/方法时,也会自动跑到原型对象上面去找。

打个比方,你玩某个网游登录了一个帐号,这个帐号不同分区开了多个小号,那么构造函数就是你自己,你创建了多个实例(不同的小号但都是你在玩),每个实例自身的属性不同(不同的分区不同的角色等;这种属性即构造函数里面this出来的或者后来用实例点出来的),你还指定了原型对象(你那一张银行卡),你甚至可以在日后重新指定原型对象(换另一张银行卡)。你的小号在游戏的时候使用的都是小号里面的角色信息(自身属性),当你开始为小号氪金的时候,小号自己是没有氪金的功能的,只有你的银行卡(原型对象)有氪金的“函数”,所以你的小号氪金相当于银行卡在氪金。所有小号都用同一张卡去氪金,于是后来啊,你的某个小号女角色跟游戏里的老公结婚了,对方为你疯狂撒币……因此你这个特别的小号有了自己的氪金函数,只是跟你的银行卡相比较之下,似是而非罢了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值