浅谈一下原型继承中我对原型链的理解
在学习JS语法中,我知道了任何一个类都拥有一个原型对象prototype,这个内置对象的好处在于不用每次new对象时都为对象开辟一个内存空间指向函数,可以使所有实例化对象共享一个属性。
但是在JS中的继承却和其他语言有些差异。今天学习了原型继承之后,先给大家看一下基本的代码。
首先我定义了一个Phone类,接着又定义了一个SmartPhone类,按照Java继承的思想来说,要想让智能手机类是Phone类的子类,就应该让它能够获取到brand price
我一开始想到的是通过给SmartPhone类的原型对象设置属性,但这样的话就没啥意义了。
至于为什么要使用 SmartPhone.prototype = new Phone 这个代码,我这里举个例子
假设有一个Person类,然后有一个Man和一个Woman类,当我给这两个子类的prototype都设置为Person的时候,尽管子类均可获取到父类的属性,但是因为Person是地址引用。
也就是说男人类和女人类的原型对象都引用了person类,如果女人类要新增一个生孩子的函数,这样的话男人类也会具备这个属性,很显然不满足要求
因此我们需要通过New的方式进行原型对象的赋值。
原型链的寻址过程为:先去实例对象的属性里面找有没有,没有的话就去原型对象的属性里面找,还是没有的话,继续一层一层找,直到Object类的prototype为null(毕竟是超类).
最后说一下这一行代码
Phone.call(this, brand, price);
call函数的作用是将这个方法的调用者改变为this所指向的对象,这里的话因为调用的实例者是SmartPhone对象,因此你可以理解为只有这一个实例化对象具备brand和price属性,
当然你一定要区分开,智能手机类的原型对象因为是new出来的,所以说brand和price属性的值是未定义,也就是undefined
加油,每一位奋斗者!!