Как работает функция наследования в Node.js? - PullRequest
2 голосов
/ 25 февраля 2012

Это функция наследования в node.js:

exports.inherits = function(ctor, superCtor) {
  ctor.super_ = superCtor;
  ctor.prototype = Object.create(superCtor.prototype, {
    constructor: {
      value: ctor,
      enumerable:    false,
      writable: true,
      configurable: true
    }
  });
};

Может кто-нибудь дать мне "общую картину" о том, как работает эта функция? Я не уверен на 100%, что получил Object.create, и ... ну, я в замешательстве!

Любая помощь / указатели будут с благодарностью ...

Merc.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2012
var Parent = function () {
  this.isParent = true;
};

Parent.prototype.doSomething = function () {
  return 42;
};

var Child = function () {
  this.isChild = true;
}
util.inherits(Child, Parent);

var c = new Child;
console.log(c.isChild);
console.log(c.doSomething());

Он просто гарантирует, что Child.prototype правильно наследует от Parent.prototype. Он также устанавливает для свойства constructor Child.prototype правильное значение.

Обязательно звоните util.inherits сразу после вашего Child заявления.

0 голосов
/ 24 апреля 2016

В настоящее время существует две версии функции наследования. Предыдущая версия node.js 5.0.0 использует Object.create, а post (включительно) v5.0.0 использует Object.setPrototypeOf.

В версии Object.create прототип superCtor устанавливается как прототип ctor.prototype. Однако в этом процессе все методы / свойства, доступные в ctor.prototype, удаляются. Вот рабочий пример;

var inherits = function (ctor, superCtor) {
    ctor.super_ = superCtor;
    ctor.prototype = Object.create(superCtor.prototype, {
        constructor: {
            value: ctor,
            enumerable: false,
            writable: true,
            configurable: true
        }
    });
};

function Manager(managerName) {
    this.managerName = managerName;
}

Manager.prototype.getManagerName = function () {
    return this.managerName;
}

function Team(managerName, teamName) {
    this.teamName = teamName;
    Team.super_.apply(this, arguments);
}


Team.prototype.getTeamDetails = function () {
    return this.teamName + ' is managed by ' + this.managerName;
}

inherits(Team, Manager);

var obj = new Team('Klopp', 'LiverpoolFC');

console.log(obj.getTeamDetails()); //obj.getTeamDetails is not a function

Вышеуказанная проблема решена в Node.js версии 5.0.0 или новее. util.inherits теперь использует setPrototypeOf, который решает эту проблему.

var inherits = function (ctor, superCtor) {
    ctor.super_ = superCtor;
    ctor.prototype = Object.create(superCtor.prototype, {
        constructor: {
            value: ctor,
            enumerable: false,
            writable: true,
            configurable: true
        }
    });
};

function Manager(managerName) {
    this.managerName = managerName;
}

Manager.prototype.getManagerName = function () {
    return this.managerName;
}

function Team(managerName, teamName) {
    this.teamName = teamName;
    Team.super_.apply(this, arguments);
}


Team.prototype.getTeamDetails = function () {
    return this.teamName + ' is managed by ' + this.managerName;
}

inherits(Team, Manager);

var obj = new Team('Klopp', 'LiverpoolFC');

console.log(obj.getTeamDetails()); //obj.getTeamDetails is not a function

Эта ссылка содержит подробное объяснение того, как наследуется работа в Node.js. Node.js - Анатомия наследства

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...