Maison  >  Article  >  interface Web  >  3 méthodes d'implémentation de l'héritage dans les connaissances javascript_Basic

3 méthodes d'implémentation de l'héritage dans les connaissances javascript_Basic

WBOY
WBOYoriginal
2016-05-16 15:17:441131parcourir

Utilisez Object.create pour implémenter l'héritage de classe

Ce qui suit est un exemple tiré du site officiel

//Shape - superclass
function Shape() {
 this.x = 0;
 this.y = 0;
}

Shape.prototype.move = function(x, y) {
  this.x += x;
  this.y += y;
  console.info("Shape moved.");
};

// Rectangle - subclass
function Rectangle() {
 Shape.call(this); //call super constructor.
}

Rectangle.prototype = Object.create(Shape.prototype);

var rect = new Rectangle();

rect instanceof Rectangle //true.
rect instanceof Shape //true.

rect.move(1, 1); //Outputs, "Shape moved."

À ce stade, le constructeur du prototype Rectangle pointe vers la classe parent. Si vous devez utiliser votre propre constructeur, vous pouvez le spécifier manuellement, comme suit

Rectangle.prototype.constructor = Rectangle;

Utilisez util.inherites fourni avec le package d'outils utilitaires

Grammaire

util.inherits(constructeur, superConstructeur)
Exemple

const util = require('util');
const EventEmitter = require('events');

function MyStream() {
  EventEmitter.call(this);
}

util.inherits(MyStream, EventEmitter);

MyStream.prototype.write = function(data) {
  this.emit('data', data);
}

var stream = new MyStream();

console.log(stream instanceof EventEmitter); // true
console.log(MyStream.super_ === EventEmitter); // true

stream.on('data', (data) => {
 console.log(`Received data: "${data}"`);
})
stream.write('It works!'); // Received data: "It works!"

C'est aussi un exemple très simple. En fait, le code source utilise les nouvelles fonctionnalités d'ES6. Jetons un coup d'œil

.
exports.inherits = function(ctor, superCtor) {

 if (ctor === undefined || ctor === null)
  throw new TypeError('The constructor to "inherits" must not be ' +
            'null or undefined');

 if (superCtor === undefined || superCtor === null)
  throw new TypeError('The super constructor to "inherits" must not ' +
            'be null or undefined');

 if (superCtor.prototype === undefined)
  throw new TypeError('The super constructor to "inherits" must ' +
            'have a prototype');

 ctor.super_ = superCtor;
 Object.setPrototypeOf(ctor.prototype, superCtor.prototype);
};

Parmi eux, Object.setPrototypeOf est une nouvelle fonctionnalité d'ES6, qui définit le prototype d'un objet spécifié sur un autre objet ou null

Grammaire

Object.setPrototypeOf(obj, prototype)
obj est un objet qui sera prototypé
prototype est le nouveau prototype d'obj (peut être un objet ou nul).

Si défini sur null, c'est l'exemple suivant

Object.setPrototypeOf({}, null);
Je pense que setPrototypeOf porte bien son nom, spécialisé dans les prototypes pour le plaisir.
Alors, comment cette chose est-elle mise en œuvre ? À ce stade, vous devez utiliser le maître __proto__

Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {
 obj.__proto__ = proto;
 return obj; 
}

Attribuez simplement un proto à obj.__proto__.

Utilisez le mot-clé extends

Les étudiants qui connaissent Java devraient être très familiers avec ce mot-clé. L'héritage en Java est réalisé par celui-ci.
Le mot-clé de classe nouvellement ajouté dans ES6 est le sucre syntaxique, mais son essence est toujours une fonction.

Dans l'exemple suivant, une classe nommée Polygon est définie, puis une classe Square qui hérite de Polygon est définie. Notez que super() utilisé dans le constructeur, supper() ne peut être utilisé que dans le constructeur et la super fonction doit être appelée avant de pouvoir être utilisée.

class Polygon {
 constructor(height, width) {
  this.name = 'Polygon';
  this.height = height;
  this.width = width;
 }
}

class Square extends Polygon {
 constructor(length) {
  super(length, length);
  this.name = 'Square';
 }
}

Après avoir utilisé des mots-clés, vous n'avez pas besoin de configurer divers prototypes. Les mots-clés ont été encapsulés, ce qui est très rapide et pratique.

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn