2017-08-31 156 views
0

執行以下代碼時,我得到一個TypeError屬性未定義的打字稿

server.class.ts

import {Handlers} from './handlers.class'; 
export class Server{ 
    private _hInstance: Handlers; 
    static _instance: Server; 
    private constructor(){ 
     this._hInstance = new Handlers(); 
     this._hInstance.mymethod(); 
    } 
    static instance(): Server{ 
     if(!!!Server._instance){ 
      Server._instance = new Server(); 
     } 
     return Server._instance; 
    } 
} 

handler.class.ts

import { Polo } from './../extapi/polo.class'; 
export class Handlers{ 
    private _polo: Polo; 
    constructor(){ 
     this._polo = Polo.instance(); // same as Server.instance() 
    } 
    mymethod(){ 
     this._polo.someMethod(); // Error 
} 

馬球類使用定義單個實例的相同技術,並提供用於返回實例的靜態方法instance()。該代碼單獨測試,工作正常。該類型的錯誤引發了undefined屬性_polo無法讀取。這真是令人困惑,因爲在其實例上調用someMethod之前已經實例化類Polo

謝謝。

+0

你能提供一個jsfiddle的問題嗎? mymethod叫什麼名字? – Harald

+0

@Harald'mymethod'只能在'Server'類的構造函數中調用。爲了澄清,代碼庫很長,我不確定是否發佈了整個代碼(6個類,2個接口),所以我只是找出引起問題的部分。如果問題不明確,那麼我會發布整個代碼(我很樂意回答任何其他問題)。謝謝 –

+0

@Harald jsfiddle:https://jsfiddle.net/mr0cool/bf9e8wmy/ –

回答

0

處理程序類中的屬性undefined錯誤是由於Polo.instance()方法返回對靜態初始化的Polo對象的引用。在處理程序類中將它設爲私有意味着,對於Handler的每個實例,都會聲明一個新的私有屬性,它將引用相同的靜態實例。編譯時,這不會引發任何錯誤。運行時,每次訪問this._polo時,都無法引用靜態定義的實例,並導致引用undefined。解決方案是將this._polo從私有變爲靜態。