以下是个人理解,欢迎大家一起讨论。
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的使用场景只有一个,就是用于修改自己自定义的对象。