浅谈对object.prototype的理解

以下是个人理解,欢迎大家一起讨论。

object.prototype是什么?

根据MDN的说明,object.protoType表示object的原型对象。
原型原型,顾名思义,就是用于创建对象的模板,如下图通过new boss这个原型创建了myboss实例。
而原型链反映的是原型的原型,如下图boss的原型是person
在这里插入图片描述

如下,以person为原型创建boss实例,boss实例就能获得person原型的属性和方法。

let person = function(name) {
	this.name = name;
	this.getName = function(){console.log(this.name)}
};
let boss = new person('boss');
boss.getName() // boss

接着搭建原型链就需要用到object.prototype方法了。

let person = function(name) {
	this.name = name;
	this.getName = function(){console.log(this.name)}
};
let boss = function(name, money) {
	person.call(this, name); // 将老板的姓名告诉person原型
	this.money = money;
}
// boss原型继承person原型
boss.prototype = Object.create(person.prototype)

// 通过prototype将payMoney加入boss原型
boss.prototype.payMoney = function() {console.log(this.money)}

let myboss = new boss('myboss',6000);
myboss.payMoney(); //6000

// 验证myboss是否在原型链上
console.log(person.prototype.isPrototypeOf(myboss)); // true,在原型链上
console.log(boss.prototype.isPrototypeOf(myboss));

这样就生成了我的老板,他是通过boss这个原型创建的,而boss原型继承了person原型,这就是原型和原型链。

为什么要有object.prototype?

通过刚刚的阅读,想必也有些联想,myboss.payMoney()怎么看起来都和string.split(’’)这么像呢。事实上,他们确实是一样的来源,都是通过原型和原型链形成的。就如我们日常用到的string.split(’’)等方法,特别实用。

在刚刚的代码里也知道prototype返回的是实例的原型,那么就可以通过该方法对原型进行复写、新增等操作,但值得注意的是,原型是实例的模板,如果原型改动了,那么相应的实例也会有改变,这就可能因为原型的更改而造成灾难性后果。

但其意义也是巨大的,功能强大,一处改动,整个软件相关代码都会通过原型链产生相应的效果,恰如MDN在描述中所言。

在这里插入图片描述

然而,怎么理解这个通过原型链改变所有对象呢,可以参考下这位大佬的博客:
https://blog.csdn.net/xiaoermingn/article/details/80745117

object.prototype应该在哪些场景使用?

首先也是最后,使用object.prototype要坚守一个重要原则——“Don’t Modify Objects You Don’t Own”。
这样,object.prototype的使用场景只有一个,就是用于修改自己自定义的对象。

引用

https://blog.csdn.net/xiaoermingn/article/details/80745117

https://www.zhihu.com/question/26924011

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值