1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > JavaScript面向对象——深入理解原型继承

JavaScript面向对象——深入理解原型继承

时间:2020-10-23 21:36:34

相关推荐

JavaScript面向对象——深入理解原型继承

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。