js的prototype属性
定义和用法:
prototype 属性使您有能力向对象(函数)添加属性和方法,因为函数也是对象。
prototype是函数的的属性,本质是函数的原型对象。
是的,就是因为函数调用prototype的时候是和对象调用属性的时候一样的,我们才把prototype说成是函数的一个属性,而函数的这个属性其实是一个对象
特别指出:
Array.prototype是一个数组
String.prototype是一个字符串
Object.prototype是一个对象
js设计了继承,但是不想让气根面向对象语言一样正式,就引用他们的new关键字,
并且js没有类这个概念所有就在new后面跟的是构造函数啦!
于是function dog(name){
this.name = name;
this.color = "黑狗"
}
注意:构造函数中的这个this关键字,它就代表了新创建的实例对象。
let a = new dog('大毛');
let b = new dog('小黄')
这个带来带来了一个缺点就是没办法共享属性,
a.color="白色"
console.log(b.color)//黑狗
于是就引入了prototype对象,所有的实例对象需要共享的属性和方法,都在在了它里面,不需要共享的放在了构造函数里面。
实例对象一旦创建,将自动引用prototype对象的属性和方法,也就是说,实例对象的属性和方法,
分成两种,一种是本地的,一种是引用的。
还以上面的demo为例
dog.prototype = {species:'犬科'}
所以console.log(a.species)
console.log(b.species)//犬科
species放在prototype对象里面,是两个实例共享的,只要修改prototype对象,就会同时影响两个实例对象
a.species = "科";
console.log(a.species)//“科”
console.log(b.species);//“犬科”
dog.prototype.species = "猫科"
console.log(a.species)// “科”
console.log(b.species)//“猫科”
总结:
由于所有的实例对象共享同一prototype对象,那么从外界看其阿里,prototype对象就好像
是实例对象的原型,而实例对象则好像“继承”了prototype对象一样。
这就是javascript继承机制的设计思想。