2017-05-09 1 views
0

Ich bin ziemlich neu zu es6. Unten ist meine einfache Student Klasse mit einem Konstruktor, der 2 Argumente akzeptiert. Ich gebe Standardwerte durch Aufrufen von Funktion in der Konstruktorsignatur selbst, wenn die Argumente nicht übergeben werden.ES6-Typ Fehler beim Zuweisen von Standardwerten im Konstruktor

class Student { 

    defaultRno =() => -1; 
    defaultName =() => "unknown"; 

    /** 
    * The default constructor 
    */ 
    constructor(regNo = this.defaultRno(), name = this.defaultName()) { 
     this.regNo = regNo; 
     this.name = name; 
    } 

    setRegNo = (rno = this.defaultRno()) => this.regNo = rno; 
    setName = (name = this.defaultName()) => this.name = name; 

    displayConsole =() => console.log(`Reg.No# ${this.regNo}\nName: ${this.name}`); 

} 
// create student object 
var stu = new Student(); 
stu.displayConsole(); 

Dies führt mit folgenden Fehler:

constructor(regNo = -1, name = 'unknown') { 
     this.regNo = regNo; 
     this.name = name; 
    } 

UPDATE: Auf die gleiche Weise zu initiieren

index.js:9Uncaught TypeError: this.defaultRno is not a function 
    at new Student (index.js:9) 
    at Object.<anonymous> (index.js:21) 
    at __webpack_require__ (bootstrap f01272b…:555) 

Wenn ich den Konstruktor wie unten ändern, wird der Fehler nicht gesehen Standardwerte funktionieren mit Funktion. Überprüfen Sie setRegNo und setName oben. Ich habe beobachtet, dass es nicht mit dem Konstruktor funktioniert.

+1

Zu der Zeit werden die Parameter an den Konstruktor ausgewertet werden, und Standardwerte angewendet wird, wird das Objekt nicht vollständig aufgebaut ist, und immer noch fehlt Methoden wie 'defaultRno'. Gibt es einen Grund, warum man nicht einfach 'constructor (regNo = -1, name =" unknown ")' 'schreiben kann? –

+0

Das ist nicht ES6. Sie verwenden ein experimentelles Transpiler-Plugin und Sie verstehen nicht, was die Klassenfeld-Syntax tut. – Bergi

+1

Pfeilfunktionen in einem Klassenkörper funktionieren nicht so, wie Sie möchten. Sie können jedoch Kurzschreibweise-Deklarationen wie 'setRegNo() {}' verwenden. – Marty

Antwort

0

Da die Konstruktormethode ist, wie Sie ein Objekt mit einer Klasse in Javascript erstellt initialisieren - this wird immer ein leeres Objekt sein, wenn Sie versuchen, darauf zuzugreifen innerhalb der Funktionsparameter des Konstruktors selbst.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes#Class_body_and_method_definitions

class Foo { 
    constructor(foo =() => console.log(this), bar =() => console.log('baz')) { 
     foo(); // {} 
     bar(); // baz 
    } 
} 

const foo = new Foo(); 

https://repl.it/HnjB/2

+0

Das macht Sinn. Ist die Klasse auch undefiniert? Was ist mit Konstruktor? (Foo = Student.defaultRno()) –

+0

@ JeremyLawsonyou kann tatsächlich auf statische Methoden zugreifen, die in der Konstruktorfunktion params für die Klasse definiert sind. Die Klasse ist nicht "undefiniert" ... https://repl.it/HnjB/5 – Maxwelll

Verwandte Themen