You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:47:43