prototype原型对象(面向对象---自动继承)

上一篇的构造函数是有缺陷的,在每一次new function(实参)的时候,function里的函数会自动创建,虽然每一次创建的函数都存在于不同的地址里,但是函数定义是一模一样的,都是console.log(`I'm${this.name}I'm${this.age}`);如果每次new一个新的对象,那么function将会创建无数次,浪费内存。这时候就需要一个可共用的原型对象prototype。以后的构造函数中也只应有属性,不应有方法。

其实在new Emp(实参)之后,new的子对象会自动继承Emp(实参)里的prototype。(当构造函数创建的时候也会跟着一起创建)。所以只需要在创建Emp(形参)构造函数后,把子对象需要继承的函数写入构造函数的prototype里。也就是Emp.prototype.intro=function(){console.log(`I'm${this.name}I'm${this.age}`);}子对象中的_ _proto_ _会自动指向prototype。可用console.log(caiBiBa.intro==Emp.prototype.intro);来验证两个是否指向同一个。

当caiBiBa.intro()的时候首先会在自身的caiBiBa中找,没找着时会沿着_ _proto_ _去到父对象中查找。

父对象中也能存储共有属性,比如Emp.prototype.dept="tech";子对象也能调用这个共有属性:caiBiBa.dept。

子对象可以修改自有属性(eg:caiBiBa.name="aba"),共有属性只能由父对象自己修改,如果子对象修改共有属性,会变成在子对象中创建一个同名的属性(eg:caiBiBa.dept="art"),在调用时因为有顺序(先在自身查找,找不到再到父对象中查找)所以只会调用不小心创建的同名属性,而无论父对象如何修改它的共有属性也与子对象无关了。但如果用caiBiBa._ _proto_ _.dept="art"来改的话,是改的父对象中的属性,因为父对象.prototype==子对象._ _prototype_ _。

你可能感兴趣的:(prototype原型对象(面向对象---自动继承))