2016-08-26 105 views
1

我想用Javascript使用面向對象編程技術,但是我沒有從類訪問另一個類的方法。如何才能做到像下面這樣:Javascript - 如何從類訪問方法到另一個類?

class one{ 

    write(){ 
    console.log("Yes! I did!"); 
    } 
} 

class two{ 
    var object=new one(); 

    tryingMethod(){ 
    object.write(); 
    } 
} 

編輯:

錯誤:未捕獲的SyntaxError:意外的標識 - >>用於提前var object=new one();

感謝。

+0

您不能直接在類中聲明變量。 'var object = new one();'是語法錯誤。 – Barmar

+0

@Barmar我明白了,我是Javascript中的新成員;) – hamdi

回答

1

您的語法不合法。你的控制檯應該有一個錯誤,告訴你哪一行代碼不正確。

如果它是一個靜態方法(不使用任何實例數據),則將其聲明爲靜態方法,並且可以直接調用它。

如果是實例方法,那麼通常會創建一個類型爲one的對象,然後調用該對象上的方法(通常在構造函數中)。

爲了讓靜態方法(這似乎是在你的具體情況罰款):

class One { 
    static write(){ 
    console.log("Yes! I did!"); 
    } 
} 

class Two { 
    tryingMethod(){ 
    One.write(); 
    } 
} 

對於非靜態的情況下,你沒有正確的語法。看樣子你想創建一個構造函數One對象的實例Two這樣的:

class One { 
    write(){ 
    console.log("Yes! I did!"); 
    } 
} 

class Two { 
    constructor() { 
     this.one = new One(); 
    } 

    tryingMethod(){ 
    this.one.write(); 
    } 
} 

var x = new Two(); 
x.tryingMethod(); 

注:我也跟使用與該大寫字母開頭的標識符的一個常見的JavaScript約定類/構造函數名稱,例如One而不是one

+0

他用一個對象'object.write()'調用它。爲什麼它需要是靜態的? – Barmar

+0

@Barmar - 我的回答清楚地解釋說,他可以使用靜態或非靜態方法,具體取決於方法是否使用實例數據。他的方法不訪問任何實例數據,所以我展示了靜態方法。我還添加了一個更正的非靜態示例(OP有錯誤)。 – jfriend00

+0

@Barmar - 我爲非靜態情況添加了一個更正的示例。 – jfriend00

2

我建議你做的是不綁一起上課如此緊密,做這樣的事情...

class One { 
    write() { 
    console.log("Yes! I did!"); 
    } 
} 

class Two { 
    constructor(one = new One()) { 
    this.one = one; 
    } 
    tryingMethod() { 
    this.one.write(); 
    } 
} 

現在你可以做的是...

const two = new Two(); 
two.write(); 

這使您能夠更好地分離關注點,並允許您更輕鬆地對Two類進行單元測試,因爲如果需要您可以傳遞One類的模擬實現。

describe("two class",() => { 
    it("should do something",() => { 
    const one = { 
     write: sinon.spy() 
    }; 
    const two = new Two(one) 

    two.tryingMethod(); 

    expect(one.write.calledOnce).to.be.ok; 
    }); 
});