2017-05-09 54 views
0

對於es6我很新。以下是我的簡單Student類與接受2個參數的構造函數。我通過在構造函數簽名本身中調用函數來分配默認值,當參數未被傳遞時。在構造函數中分配默認值時出現ES6類型錯誤

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) 

當我更改類似下面的構造,是沒有看到錯誤:

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

UPDATE: 開始以同樣的方式

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(); 

這與下面的錯誤導致默認值與函數一起使用。上面檢查setRegNosetName。我發現它不適用於構造函數。

+1

在參數給構造進行評價時,缺省應用,該對象不完全構造,並且仍然缺少像'defaultRno'方法。有沒有理由不能只寫'constructor(regNo = -1,name =「unknown」)'? – 2017-05-09 05:20:37

+0

這不是ES6。您正在使用實驗性的轉換器插件,並且您不明白類字段語法的作用。 – Bergi

+1

類體中的箭頭函數不會按照您想要的方式工作。但是,您可以使用簡寫方法聲明,如'setRegNo(){}'。 – Marty

回答

0

因爲構造函數方法是如何初始化用javascript中的類創建的對象 - 如果要在構造函數本身的函數參數中訪問它,它總是空對象。

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

這很有道理。這個類也是未定義的嗎?關於構造函數(foo = Student.defaultRno()) –

+0

@JeremyLawsonyou實際上可以從構造函數params中訪問類中定義的靜態方法。該類不是「未定義的」... https://repl.it/HnjB/5 – Maxwelll