que prototipo multiple herencia javascript class import prototype ecmascript-6

javascript - multiple - ES6: declara un método prototipo en una clase con una declaración de importación



javascript herencia multiple (3)

Sí. La sintaxis de la class es simplemente azúcar sintáctica (muy sofisticada) para las funciones de constructor. Por lo tanto, Car seguirá siendo una función con una propiedad prototype y puede hacer exactamente lo mismo:

import getColor from ''./getColor''; // ... Car.prototype.getColor = getColor;

Sin embargo, eso hace que el método sea enumerable, a diferencia de los métodos creados a partir de la sintaxis de la clase. Por lo tanto, es posible que desee utilizar Object.defineProperty en Object.defineProperty lugar.

Estoy usando clases de ES6. Quiero poder hacer esto:

function Car(color) { this.color = color; }; Car.prototype.getColor = require(''./getColor'');

Donde obtener color es una función exportada. es decir, quiero poder importar una función desde un archivo externo y establecerlo como un método prototipo en la Clase ES6. Este es el tipo de sintaxis de la que estoy hablando:

class Car { constructor(color) { this.color = color; } getColor() {} // I want to import this function from ''./getColor'', as above }

¿Es esto factible?


Si está interesado, he desarrollado un pequeño módulo para vincular funciones con varios parámetros a métodos de clase: https://github.com/ngryman/to-method .

const toMethod = require(''to-method''); function Car(color) { this.color = color; } toMethod(Cat, { getColor: require(''./getColor'') });


Todavía puede adjuntar un método en el prototipo de una class ; después de todo, las clases son simplemente azúcar sintáctica sobre un "objeto funcional", que es la antigua forma de usar una función para construir objetos.

Como quieres usar ES6, usaré una importación de ES6.

Esfuerzo mínimo, utilizando el prototipo:

import getColor from ''path/to/module''; class Car { ... } Car.prototype.getColor = getColor;

Como puede ver, aún usa la propiedad prototipo para adjuntar un método, si lo desea.

Llamar al módulo dentro del método de una clase:

Alternativamente, si no desea utilizar la propiedad prototipo, siempre puede hacer que su método devuelva la función del módulo:

import getColor from ''path/to/module''; class Car { getColor () { return getColor.call(this); } }

Usando un Getter

También podría ser un poco complicado y usar un "captador" para lograr esto de una manera diferente.

import getColor from ''path/to/module''; class Car { get getColor () { return getColor.bind(this) } }

Luego puede usarlo simplemente llamando a myInstanceOfCar.getColor()

O en un uso más semántico de un getter:

class Car { get color () { return getColor.call(this) } } // ... const color = myInstanceOfCar.color;

Tenga en cuenta que los captadores / definidores no pueden tener el mismo nombre que las propiedades que establece en el constructor. Terminará superando la pila de llamadas máxima con una recursión infinita cuando intente usar el setter para establecer esa misma propiedad. Ejemplo: set foo (value) { this.foo = value }

Propiedades de la clase ES2016

Si está utilizando Babel para transpilar (y está utilizando propuestas experimentales ) y desea utilizar ES2016, puede utilizar la siguiente sintaxis (pero tenga en cuenta que esto aplica el método directamente al objeto y no lo establece en El Prototipo):

import getColor from ''path/to/module''; class Car { getColor = getColor; }

Enlace opcional con propiedades de clase

Si usa la sintaxis abreviada para establecer una propiedad, no tendrá que vincular el método (la configuración es como una propiedad que cambia a lo que se refiere "esto", esencialmente vinculando automáticamente), pero ciertamente puede, si elige ( como si quisieras unir algo más):

getColor = getColor.bind(this);