美文网首页
用 Object.create 实现类式继承

用 Object.create 实现类式继承

作者: SingleDiego | 来源:发表于2019-06-03 15:35 被阅读0次

Object.create

官方文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create




Object.create() 方法创建一个新对象,使用现有的对象作为新创建的对象的 __proto__

const person = {
  isHuman: true,
  hello: function () {
    console.log('hello!');
  }
};

const me = Object.create(person);

现在对象 me 的原形指向的是对象 person:

me.__proto__ === person
// true

me.isHuman
// true

me.hello()
// hello!




用 Object.create 实现类式继承

// 父类
function Shape() {};

// 父类方法
Shape.prototype.duplicate = function() {
  console.log('duplicate')
};

// 子类
function Circle(radius) {
  this.radius = radius;
};

// Circle 继承 Shape
Circle.prototype = Object.create(Shape.prototype);

// 子类的方法
Circle.prototype.draw = function() {
  console.log('draw');
};

现在由 Circle 构造函数生成的对象 c 具有了其父类 Shape 的属性与方法:

let c = new Circle(1);

c.duplicate()
// duplicate

来解释一下:

c.__proto__ === Circle.prototype
// true

实例 c 的 __proto__ 指向 c 的构造函数 Circleprototype,这没什么问题。

那么 Circle.prototype__proto__ 现在指向什么呢?

我们声明了 Circle.prototype = Object.create(Shape.prototype);所以 Circle.prototype__proto__ 指向 Shape.prototype

Circle.prototype.__proto__ === Shape.prototype
// true

所有实例 c 的原形的原形就指向了 Shape.prototype

c.__proto__.__proto__ === Shape.prototype
// true

这就是继承的原理。




修正构造函数

但这个继承其实隐含了一个逻辑问题。

let c = new Circle(1);

c.constructor
// ƒ Shape() {}

现在实例 c 的构造函数 constructor 变成了 Shape() 而不是 Circle()。从逻辑上讲实例 c 应当是构造函数 Circle() 生成的。所以我们修改了原形之后,应该重新修正构造函数。

// 父类
function Shape() {};

// 父类方法
Shape.prototype.duplicate = function() {
  console.log('duplicate')
};

// 子类
function Circle(radius) {
  this.radius = radius;
};

// Circle 继承 Shape
Circle.prototype = Object.create(Shape.prototype);
// 修正构造函数
Circle.prototype.construcor = Circle;

// 子类的方法
Circle.prototype.draw = function() {
  console.log('draw');
};

let c = new Circle(1);




使用中间函数进行继承

我们可以用一个函数把实现继承的代码封装一下,以更便利地调用:

// 传入两个构造函数,实现继承
function extend(Child, Parent) {
  Child.prototype = Object.create(Parent.prototype);
  Child.prototype.construcor = Child;
}

相关文章

  • Object.create实现类继承和克隆对象

    Object.create实现类继承 先看不用Object.create来实现继承 效果: 用Object.cre...

  • 用 Object.create实现类式继承

    下面的例子演示了如何使用Object.create()来实现类式继承。这是一个所有版本JavaScript都支持的...

  • 用 Object.create 实现类式继承

    Object.create 官方文档:https://developer.mozilla.org/zh-CN/do...

  • javascript 使用Object.create实现类式继承

    Object.create()方法创建一个拥有指定原型和若干个指定属性的对象。 什么是prototype: 每个函...

  • JavaScript类的继承

    Object.create() 实现单继承 Object.assign() 实现多继承 Object.assign...

  • js面向对象实现面向对象(二)

    上一篇讲到js实现对类对封装,本篇介绍类的继承,多态。 类的继承 类式继承 类式继承方式是将父类的实例赋在子类的原...

  • 5. oop继承

    JavaScript 继承实现方式 A. 类式继承 所谓类式继承,就是将子类的原型指向父类的一个实例。这样优缺点就...

  • js 继承

    Object.create()实现经典继承 me和person都是Object对象,me继承了person的所有属...

  • js实现继承

    1、使用ES6的方式 2、使用原型链组合继承 3、使用Object.create实现继承

  • JS~继承

    JS中的继承按照是否使用了object.create 可分为两类(object.create 是ES5新增的方法)...

网友评论

      本文标题:用 Object.create 实现类式继承

      本文链接:https://www.haomeiwen.com/subject/bpoqxctx.html