js的继承思想

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继承机制的设计思想。

 

posted @ 2019-01-04 17:02  lieaiwen  阅读(186)  评论(0编辑  收藏  举报