JavaScript中如何让其他对象继承原型函数?
实现JavaScript继承的几种方法(针对你的
basicID构造函数) 嘿,我来帮你搞定这个继承问题!你已经写好了basicID的构造函数和原型方法,现在要让其他对象(比如empID)继承它的原型函数,这里有几种实用的方法,结合你的代码给你演示:
1. 组合继承(最常用的经典方式)
这种方式结合了构造函数继承和原型链继承,既可以继承父类的实例属性,又能共享父类的原型方法,还避免了原型链继承的实例属性共享问题。
// 保持你原来的基础构造函数代码 function basicID(id, firstname, lastname) { this.firstname = firstname; this.lastname = lastname; } basicID.prototype = { setFirstName:function(firstname){ this.firstname = firstname; }, setLastName:function(lastname){ this.lastname = lastname; }, getFirstName:function(){ return this.firstname; }, getLastName:function(){ return this.lastname; } }; // 定义子类empID的构造函数 function empID(id, firstname, lastname, department) { // 调用父构造函数,继承实例属性(构造函数继承) basicID.call(this, firstname, lastname); // 添加子类自己的专属属性 this.id = id; this.department = department; } // 让子类原型指向父类实例,继承原型方法(原型链继承) empID.prototype = new basicID(); // 修复constructor指向(不然empID的constructor会默认指向basicID) empID.prototype.constructor = empID; // 给子类添加专属方法 empID.prototype.getDepartment = function() { return this.department; }; // 测试一下效果 const myEmp = new empID(1001, "Alice", "Wang", "Product"); console.log(myEmp.getFirstName()); // 输出 "Alice" myEmp.setLastName("Li"); console.log(myEmp.getLastName()); // 输出 "Li" console.log(myEmp.getDepartment()); // 输出 "Product"
2. Object.create() 继承(ES5+ 更优雅的方式)
这种方法不用创建父类的实例,直接通过Object.create()继承父类的原型,更节省内存,也避免了父类实例属性被共享的问题。
// 同样保留你原来的basicID代码 function basicID(id, firstname, lastname) { this.firstname = firstname; this.lastname = lastname; } basicID.prototype = { setFirstName:function(firstname){ this.firstname = firstname; }, setLastName:function(lastname){ this.lastname = lastname; }, getFirstName:function(){ return this.firstname; }, getLastName:function(){ return this.lastname; } }; function empID(id, firstname, lastname, department) { basicID.call(this, firstname, lastname); // 继承父类实例属性 this.id = id; this.department = department; } // 直接继承父类原型,无需创建父类实例 empID.prototype = Object.create(basicID.prototype); empID.prototype.constructor = empID; // 修复constructor指向 // 添加子类专属方法 empID.prototype.getDepartment = function() { return this.department; }; // 测试 const anotherEmp = new empID(1002, "Bob", "Zhang", "Tech"); console.log(anotherEmp.getLastName()); // 输出 "Zhang"
3. ES6 Class 继承(最简洁易读的方式)
如果你的运行环境支持ES6(现代浏览器/Node.js),用class语法写继承会更清晰直观,本质是原型继承的语法糖。
// 可以把原来的basicID改成class形式,也可以直接继承函数式构造函数 class BasicID { constructor(firstname, lastname) { this.firstname = firstname; this.lastname = lastname; } setFirstName(firstname) { this.firstname = firstname; } setLastName(lastname) { this.lastname = lastname; } getFirstName() { return this.firstname; } getLastName() { return this.lastname; } } // 用extends关键字直接继承父类 class EmpID extends BasicID { constructor(id, firstname, lastname, department) { super(firstname, lastname); // 调用父类构造函数,必须写在子类属性之前 this.id = id; this.department = department; } // 子类专属方法 getDepartment() { return this.department; } } // 测试 const es6Emp = new EmpID(1003, "Charlie", "Liu", "Design"); es6Emp.setFirstName("Charlie"); console.log(es6Emp.getFirstName()); // 输出 "Charlie" console.log(es6Emp.getDepartment()); // 输出 "Design"
小提示:
- 不管用哪种方法,
basicID.call(this, ...)(或者ES6的super())都是用来继承父类的实例属性,确保每个子类实例都有自己的属性副本,不会出现属性共享的问题。 - 继承原型方法的核心是让子类的原型链指向父类的原型,这样子类实例就能访问到父类原型上的所有方法。
内容的提问来源于stack exchange,提问作者cattarantadoughan
相关产品推荐
相关产品推荐

