著作权归该书作者所有。本读书笔记仅供个人记录学习使用,如若侵权,请通知到我,我将立即删除全部内容。
继承的多种方式
题外话:JavaScript没有类的概念,但可以用构造器函数来实现相同的功能。有封装吗?对象本身就包括数据及方法。有聚合吗?一个对象中可以包含其他对象,对象是靠函数来实现的,而函数本身也就是对象。
原型链
每个函数都有一个prototype属性,该属性指向某一个对象。函数被new操作符调用时会创建并返回一个对象,并且该对象中会有一个指向其原型对象的proto,通过该链接可以在新建的对象中调用相关原型对象的属性和方法。
例如对象A的属性中有一个proto隐藏属性,它指向了对象B,B的proto属性指向对象C,直到链条末端的Object对象。
这意义在于:如果某属性不在对象A中而在对象B中,依然可以来访问,这就是继承的作用,能够使每个对象都能访问其继承链上的任何一个属性。
1 |
|
在此,我们将对象直接创建在TwoDShape对象的prototype属性中,并没有拓展这些对象的原有原型。我们用构造器Shape()通过new操作符另新建了一个新对象,然后用它覆盖TwoDshape构造器的prototype属性。
JavaScript没有类的概念,因此我们需要直接用new Shape()构造一个实体,然后才能通过该实体的属性完成继承,而不能直接继承Shape()构造器。
这也确保了在继承实现后,我们对Shape()所进行的任何修改、重写甚至删除,都不会对TwoDShape()产生影响,因为我们所继承的只是由该构造器所建的一个实体。
注意:当我们对对象的prototype属性进行修改时,有可能会对对象constructor属性产生影响,所有,我们在完成继承关系设定后,要对这些对象的constructor属性进行重置
TwoDShape.prototype.constructor = TwoDShape;
Triangle.prototype.constructor = Triangle;
1 |
|