JavaScript继承——深入理解原型继承
原型继承
// 父类function School (name, address) {this.name = namethis.address = address}// 为父类添加公有方法School.prototype.getName = function () {return "Name is " + this.name}// 子类function College() {}// 继承父类College.prototype = new School('GDOU', '广东省湛江市')var college1 = new College()console.log(college1.getName()) // Name is GDOU
解析:可以看到,College的实例对象college1调用了不属于College类的方法,也就是实现了继承,为这么这样能实现呢?原理很简单,通过new School()新建了一个父类的对象,把这个对象赋值给了子类College的原型,所以College.prototype其实是一个父类的实例,验证:
而对象college1是College的实例,所以college1.__proto__指向了College.prototype所指向的对象,所以college1能访问College.prototype上的属性,验证:
也就是说新建一个对象调用方法时,在创建它的类中找不到时,会到College.prototype上找,新建第二个时也是一样,这时候就会产生一个问题。
看另一个比较有助于理解例子:
function SuperClass() {this.books = ['JavaScript', 'Nodejs', 'Java']}function SubClass() {}SubClass.prototype = new SuperClass()var instance1 = new SubClass()var instance2 = new SubClass()console.log(instance1.books) // ['JavaScript', 'Nodejs', 'Java']console.log(instance2.books) // ['JavaScript', 'Nodejs', 'Java']instance1.books.push('凑热闹的')console.log(instance2.books) // ['JavaScript', 'Nodejs', 'Java', '凑热闹的']
可见instance1改变books的值后,instance2的也会被修改,原因正是instance1与instance2的__proto__都指向创建自身的类(SubClass())的prototype所指向的对象。
除此问题外,这种继承方式无法通过子类传递参数,存在着比较大的缺陷,如何解决这两个问题?
有兴趣请移步:/fabulous1111/article/details/79593658