当前位置:首页 > JavaScript

原生js如何实现继承

2026-03-01 15:59:57JavaScript

原型链继承

通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类的属性和方法,但所有子类实例共享父类引用类型属性,可能导致修改污染。

function Parent() {
  this.name = 'parent';
}
Parent.prototype.sayName = function() {
  console.log(this.name);
};

function Child() {}
Child.prototype = new Parent(); // 核心步骤

const child = new Child();
child.sayName(); // 输出 "parent"

构造函数继承

在子类构造函数中调用父类构造函数,使用callapply改变this指向。可解决引用属性共享问题,但无法继承父类原型上的方法。

function Parent(name) {
  this.name = name;
}

function Child(name) {
  Parent.call(this, name); // 核心步骤
}

const child = new Child('child');
console.log(child.name); // 输出 "child"

组合继承

结合原型链和构造函数继承,通过调用父类构造函数继承实例属性,通过原型链继承原型方法。但会调用两次父类构造函数。

function Parent(name) {
  this.name = name;
}
Parent.prototype.sayName = function() {
  console.log(this.name);
};

function Child(name) {
  Parent.call(this, name); // 第一次调用
}
Child.prototype = new Parent(); // 第二次调用

const child = new Child('child');
child.sayName(); // 输出 "child"

寄生组合继承

优化版的组合继承,通过Object.create创建父类原型副本,避免重复调用父类构造函数。这是最理想的继承方式。

function Parent(name) {
  this.name = name;
}
Parent.prototype.sayName = function() {
  console.log(this.name);
};

function Child(name) {
  Parent.call(this, name);
}
Child.prototype = Object.create(Parent.prototype); // 核心步骤
Child.prototype.constructor = Child; // 修复构造函数指向

const child = new Child('child');
child.sayName(); // 输出 "child"

ES5实现类语法糖

通过立即执行函数返回构造函数,模拟class的extend效果,底层仍使用寄生组合继承。

原生js如何实现继承

var Animal = (function() {
  function Animal(name) {
    this.name = name;
  }
  Animal.prototype.sayName = function() {
    console.log(this.name);
  };
  return Animal;
})();

var Dog = (function(_super) {
  function Dog(name) {
    _super.call(this, name);
  }
  Dog.prototype = Object.create(_super.prototype);
  Dog.prototype.constructor = Dog;

  Dog.prototype.bark = function() {
    console.log('Woof!');
  };
  return Dog;
})(Animal);

var dog = new Dog('Buddy');
dog.sayName(); // 输出 "Buddy"
dog.bark(); // 输出 "Woof!"

标签: 如何实现js
分享给朋友:

相关文章

vue如何实现默认页面

vue如何实现默认页面

Vue 实现默认页面的方法 在 Vue 项目中,通常需要设置一个默认页面(如首页或登录页)作为用户访问时的初始页面。可以通过路由配置实现。 配置路由默认跳转 在 Vue Router 中,使用 re…

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

java如何实现异步

java如何实现异步

Java实现异步的方法 Java中实现异步编程可以通过多种方式,每种方式适用于不同的场景和需求。以下是常见的实现方法: 使用Thread类 创建新线程执行异步任务是最基础的方式。通过继承Thread…

vue如何实现滚动

vue如何实现滚动

Vue 实现滚动的方法 使用原生滚动 在Vue中可以直接使用HTML原生滚动,通过CSS设置overflow: auto或overflow: scroll来实现滚动效果。适用于简单场景。 <d…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…