首页 > 语言 > JavaScript > 正文

详解Javascript继承的实现

2024-05-06 14:59:55
字体:
来源:转载
供稿:网友

本文从以下四个方面展开话题:

•1. 混合方式实现及问题

•2. 期望的调用方式

•3. 继承库的详细实现

•4. 总结

感兴趣的朋友可以继续往下阅读详情。

我最早掌握的在js中实现继承的方法是在xx学到的混合原型链和对象冒充的方法,在工作中,只要用到继承的时候,我都是用这个方法实现。它的实现简单,思路清晰:用对象冒充继承父类构造函数的属性,用原型链继承父类prototype 对象的方法,满足我遇到过的所有继承的场景。正因如此,我从没想过下次写继承的时候,我要换一种方式来写,直到今天晚上看了三生石上关于javascript继承系列的文章(出的很早,现在才看,真有点可惜),才发现在js里面,继承机制也可以写的如此贴近java这种后端语言的实现,确实很妙!所以我想在充分理解他博客的思路下,实现一个自己今后用得到的一个继承库。

1. 混合方式实现及问题

了解问题之前,先看看它的具体实现:

- Hide code//父类构造函数function Employee(name, salary) {//实例属性:姓名this.name = name;//实例属性:薪资this.salary = salary;}//通过字面量对象设置父类的原型,给父类添加实例方法Employee.prototype = {//由于此处添加实例方法时也是通过修改父类原型处理的,//所以必须修改父类原型的constructor指向,避免父类实例的constructor属性指向Object函数constructor: Employee,getName: function () {return this.name;},getSalary: function () {return this.salary;},toString: function () {return this.name + '/'s salary is ' + this.getSalary() + '.';}}//子类构造函数function Manager(name, salary, percentage) {//对象冒充,实现属性继承(name, salary)Employee.apply(this, [name, salary]);//实例属性:提成this.percentage = percentage;}//将父类的一个实例设置为子类的原型,实现方法继承Manager.prototype = new Employee();//修改子类原型的constructor指向,避免子类实例的constructor属性指向父类的构造函数Manager.prototype.constructor = Manager;//给子类添加新的实例方法Manager.prototype.getSalary = function () {return this.salary + this.salary * this.percentage;}var e = new Employee('jason', 5000);var m = new Manager('tom', 8000, 0.15);console.log(e.toString()); //jason's salary is 5000.console.log(m.toString()); //tom's salary is 9200.console.log(m instanceof Manager); //trueconsole.log(m instanceof Employee); //trueconsole.log(e instanceof Employee); //trueconsole.log(e instanceof Manager); //false

从结果上来说,这种继承实现方式没有问题,Manager的实例同时继承到了Employee类的实例属性和实例方法,并且通过instanceOf运算的结果也都正确。但是从代码组织和实现细节层面,这种方法还有以下几个问题:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选