当前位置:首页 > 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
分享给朋友:

相关文章

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

vue如何实现排序

vue如何实现排序

实现数组排序 在Vue中可以通过计算属性或方法对数组进行排序。使用JavaScript的sort()方法结合Vue的响应式特性实现动态排序。 data() { return { item…

react如何实现插槽

react如何实现插槽

React 实现插槽的方法 React 本身没有直接提供类似 Vue 的插槽(slot)概念,但可以通过以下几种方式实现类似功能: 使用 props.children React 组件可以通过 pr…