首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >典型继承:如何获得实例?

典型继承:如何获得实例?
EN

Stack Overflow用户
提问于 2017-10-02 06:25:47
回答 3查看 118关注 0票数 0

在观看了这个视频之后,我了解了用Javascript实现继承的一种很好的方法:原型继承。此方法使用Object.create/Object.Ascription基于另一个实例创建一个新对象。这似乎非常有趣,因为它是非常容易理解正在发生的事情。例如:

代码语言:javascript
复制
const human = {
  species: 'human',
  create: function(values) {
    const instance = Object.create(this);
    Object.assign(instance, values);
    return instance;
  },
  sayName: function() {
    console.log(`Hi, my name is ${this.name}`);
  },
  saySpecies: function() {
    console.log(`Hi, I'm a ${this.species}`);
  }
}

const musician = human.create({
  species: 'musician',
  playInstrument: function() {
    console.log(`I'm a musician and I play ${this.instrument}`);
  }
});

const aHuman = human.create({ name: 'Paul' });
aHuman.sayName();
aHuman.saySpecies();

const aMusician = musician.create({ name: 'David', instrument: 'Guitar' });
aMusician.sayName();
aMusician.saySpecies();
aMusician.playInstrument();

// how to check if musician is an instance of human?
console.log(musician instanceof human);

使用经典继承,我可以使用instanceof来知道给定对象的链中是否有给定的proto (例如musician instanceof Human)。

这就是proto链的样子,它看起来非常类似于用new操作符创建的链。

问题如何用原型继承来实现相同的东西?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-02 07:15:43

你的尝试有两个主要问题:

  • instanceof的RHS必须是一个函数,所以您的类型必须构建在函数之上。
  • 您没有区分静态/类型方法和实例方法。create是一种类型方法。sayName是一个实例方法。

以下内容应如您所期望的那样起作用。

代码语言:javascript
复制
function Human(){}

Object.assign(Human, {
  create: function(values) {
    let newObj = Object.create(this.prototype);
    return Object.assign(newObj, values);
  }
});

Object.assign(Human.prototype, {
  species: 'human',
  sayName: function() {
    console.log(`Hi, my name is ${this.name}`);
  },
  saySpecies: function() {
    console.log(`Hi, I'm a ${this.species}`);
  }
});

function Musician(){}

Object.assign(Musician, Human);

Musician.prototype = Human.create({
  species: 'musician',
  playInstrument: function() {
    console.log(`I'm a musician and I play ${this.instrument}`);
  }
});

const aHuman = Human.create({ name: 'Paul' });
aHuman.sayName();
aHuman.saySpecies();

const aMusician = Musician.create({ name: 'David', instrument: 'Guitar' });
aMusician.sayName();
aMusician.saySpecies();
aMusician.playInstrument();

// how to check if musician is an instance of human?
console.log(aMusician instanceof Human);

票数 1
EN

Stack Overflow用户

发布于 2017-10-02 06:48:32

您的代码不使用继承。创建新对象的唯一位置是在这一行中:

代码语言:javascript
复制
    return Object.assign({}, this, values);
//                       ^^ here

{}创建一个继承自Object.prototype的新对象。这就像在做Object.create(Object.prototype)new Object()

代码中没有任何东西是从humanmusician继承的。

票数 1
EN

Stack Overflow用户

发布于 2017-10-02 08:26:32

@JLRishe的答案有效。但是,如果您想避免使用函数并继续使用对象,则可以实现您自己版本的instanceof。这个代码片段也能工作:

代码语言:javascript
复制
const human = {
  species: 'human',
  create: function(values) {
    let newObj = Object.create(this);
    return Object.assign(newObj, values);
  },
  instanceof: function(obj) {
    if (!Object.getPrototypeOf(this)) {
      return false;
    }
    let isPrototypeOf = (
      this === obj ||
      Object.getPrototypeOf(this) === obj ||
      this === Object.getPrototypeOf(obj) ||
      Object.getPrototypeOf(this) === obj.prototype
    );
    if (!isPrototypeOf) {
      isPrototypeOf = this.instanceof.call(Object.getPrototypeOf(this), obj);
    }
    return isPrototypeOf;
  },
  sayName: function() {
    console.log(`Hi, my name is ${this.name}`);
  },
  saySpecies: function() {
    console.log(`Hi, I'm a ${this.species}`);
  }
}

const musician = human.create({
  species: 'musician',
  playInstrument: function() {
    console.log(`I'm a musician and I play ${this.instrument}`);
  }
});

const aHuman = human.create({ name: 'Paul' });
aHuman.sayName();
aHuman.saySpecies();

const aMusician = musician.create({ name: 'David', instrument: 'Guitar' });
aMusician.sayName();
aMusician.saySpecies();
aMusician.playInstrument();

var test = {};

console.log(human.instanceof(human));
console.log(musician.instanceof(human));
console.log(musician.instanceof(Object));
console.log(aHuman.instanceof(human));
console.log(aMusician.instanceof(human));
console.log(aHuman.instanceof(musician));
console.log(aHuman.instanceof(Object));
console.log(aMusician.instanceof(musician));
console.log(musician.instanceof(test));
console.log(human.instanceof(test));
console.log(aMusician.instanceof(test));
console.log(aHuman.instanceof(test));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46520434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档