2015-09-17 15 views
71

ES6 jest w pełni dostępny w węźle 4. Zastanawiałem się, czy zawiera on koncepcję interfejsu do definiowania umów na metody, tak jak w przypadku MyClass implements MyInterface.Czy istnieje sposób na tworzenie interfejsów w ES6/Node 4?

Nie mogę znaleźć wiele z moim Google, ale może jest dostępna fajna sztuczka lub obejście.

+2

W pełni? [Zdecydowanie nie.] (Https://kangax.github.io/compat-table/es6/) – Bergi

+1

JS nadal używa [pisania kaczkami] (https://en.wikipedia.org/wiki/Duck_typing). Nie ma statycznie egzekwowanych "umów na metody". Jeśli chcesz je testować dynamicznie, możesz łatwo napisać swój własny sprawdzacz interfejsu. – Bergi

+0

W ES6 dostępnych jest już sporo książek, np. [ten jeden] (https://github.com/getify/You-Dont-Know-JS/blob/master/es6%20&%20beyond/README.md#you-dont-know-js-es6--beyond) . Jeśli przeczytasz jeden z nich, nie będziesz już musiał zastanawiać się, jaka funkcja jest dostępna i nie jest dostępna w ES6. W najgorszym przypadku [spójrz na specyfikację] (http://www.ecma-international.org/ecma-262/6.0/index.html). Termin "interfejs" pojawia się 12 razy. Nie twórz pytania dla każdej funkcji, którą może posiadać język. –

Odpowiedz

52

Interfejsy nie są częścią ES6, ale klasy są.

Jeśli naprawdę ich potrzebujesz, powinieneś spojrzeć na TypeScript, które je obsługują.

+0

"one" są interfejsami. FWIW Być może będziesz musiał dokładnie rozważyć link do powyższego transpilatora. Nie dokładnie tak, jak się spodziewałem, ale blisko. – Berniev

9

w komentarzach debiasej napisał wymienione poniżej artykuł wyjaśnia więcej na temat wzorców projektowych (na podstawie interfejsów, klas):

http://loredanacirstea.github.io/es6-design-patterns/

wzorców projektowych książka w javascript mogą być również przydatne dla Ciebie:

http://addyosmani.com/resources/essentialjsdesignpatterns/book/

Projekt wzoru = klasy + interfejs lub wielu dziedziczenie

Przykład fabrycznego wzorca w ES6 JS (aby uruchomić: węzeł example.js):

"use strict"; 

// Types.js - Constructors used behind the scenes 

// A constructor for defining new cars 
class Car { 
    constructor(options){ 
    console.log("Creating Car...\n"); 
    // some defaults 
    this.doors = options.doors || 4; 
    this.state = options.state || "brand new"; 
    this.color = options.color || "silver"; 
    } 
} 

// A constructor for defining new trucks 
class Truck { 
    constructor(options){ 
    console.log("Creating Truck...\n"); 
    this.state = options.state || "used"; 
    this.wheelSize = options.wheelSize || "large"; 
    this.color = options.color || "blue"; 
    } 
} 


// FactoryExample.js 

// Define a skeleton vehicle factory 
class VehicleFactory {} 

// Define the prototypes and utilities for this factory 

// Our default vehicleClass is Car 
VehicleFactory.prototype.vehicleClass = Car; 

// Our Factory method for creating new Vehicle instances 
VehicleFactory.prototype.createVehicle = function (options) { 

    switch(options.vehicleType){ 
    case "car": 
     this.vehicleClass = Car; 
     break; 
    case "truck": 
     this.vehicleClass = Truck; 
     break; 
    //defaults to VehicleFactory.prototype.vehicleClass (Car) 
    } 

    return new this.vehicleClass(options); 

}; 

// Create an instance of our factory that makes cars 
var carFactory = new VehicleFactory(); 
var car = carFactory.createVehicle({ 
      vehicleType: "car", 
      color: "yellow", 
      doors: 6 }); 

// Test to confirm our car was created using the vehicleClass/prototype Car 

// Outputs: true 
console.log(car instanceof Car); 

// Outputs: Car object of color "yellow", doors: 6 in a "brand new" state 
console.log(car); 

var movingTruck = carFactory.createVehicle({ 
         vehicleType: "truck", 
         state: "like new", 
         color: "red", 
         wheelSize: "small" }); 

// Test to confirm our truck was created with the vehicleClass/prototype Truck 

// Outputs: true 
console.log(movingTruck instanceof Truck); 

// Outputs: Truck object of color "red", a "like new" state 
// and a "small" wheelSize 
console.log(movingTruck); 
+19

Więc gdzie jest interfejs, który mogę komponować z innymi? –

+0

Kilka głębszych wyjaśnień znajduje się na tej stronie: https://www.sitepoint.com/object-oriented-javascript-deep-dive-es6-classes/ – 42n4

+2

Istnieje doskonała aktualizacja ES5 do ES6 na tej stronie: http: //loredanacirstea.github.io/es6-design-patterns/ – debiasej

Powiązane problemy