更新时间:2021-12-15 来源:黑马程序员 浏览量:
在ES6之前,JavaScript中并没有extends继承,如果要实现继承的效果,可以通过构造函数和原型对象来模拟实现。本节将会讲解如何利用构造函数和原型对象实现继承。
在ES6中,继承是通过定义两个类,然后子类用extends关键字继承父类。而在ES
6之前,只能用构造函数来代替类,在子类中利用call0方法将父类的this指向子类的this,这样就可以实现子类继承父类的属性。为了使读者更好地理解,下面我们通过代码进行演示。
如果没有,再到Son原型对象中查找,如果仍然没有,再到Father原型对象中查找,一沿着原型链找到最后。由于Father原型对象中有一个money()方法,所以通过Son实例对象就继承了money()方法。
不能直接将父类原型对象赋值给子类原型对象,这样会导致子类无法拥有自己的方法,在子类中添加的方法同时也会添加到父类中。下面我们通过代码演示这样一种错误的用法。
function Father() {} Father.prototype.money = function() { console.log(100000), }; function Son() {} Son.prototype = Father.prototype; //通过这种方式无法实现真正的继承 Son.prototype.exam = function() {}; //为子类增加方法的时候,会影响父类 console.log(Father.prototype.exam); //可以看到父类也有了exam方法真正的继承是子类可以拥有自己的方法,并且当子类和父类的方法名相同时,子类方法可以覆盖父类方法。
多学一招:class语法的本质
ES
6提供了class语法用来定义类,但即使没有class语法,在JavaScript中可以用构造函数和原型对象的语法来替代。那么,class语法定义的类和构造函数有没有区别呢?下面我们通过代码进行测试。
class Person {} console.log(Person.prototype); //类也有原型对象 Person.prototype.money = function() { //类也可以增加方法 console.log(100000); }; new Person().money(); //输出结果:100000