2016-05-31 82 views
3

有兩種方式打字稿定義模塊:爲什麼TypeScript需要「this」。 「內部」模塊的前綴?

「單身」 生活:

import app = require("durandal/app"); 
import ko = require("knockout"); 

export var name = ko.observable(); 

export function sayHello() { 
    app.showMessage('Hello ' + name() + '! Nice to meet you.', 'Greetings'); 
} 

「短暫」 的生活方式:

import app = require("durandal/app"); 
import ko = require("knockout"); 

class AnythingYouLike { 
    name = ko.observable(); 

    sayHello() { 
     app.showMessage('Hello ' + this.name() + '! Nice to meet you.', 'Greetings'); 
    } 
} 

export = AnythingYouLike; 

我用引號我的名字對於這些不同的方式來定義一個模塊,因爲我無法弄清楚「官方」名稱是什麼。

使用「瞬態」風格,尤其是在使用像Durandal這樣的框架時,可以更好地控制viewmodel模塊的生活方式並避免尷尬的錯誤。一個缺點是,你必須在任何地方使用「this」,這有兩個問題:

  1. 將模塊從一種樣式更改爲另一種是很乏味的。
  2. this.灑到處都是嘈雜。

爲什麼實際上根本不需要使用this.,爲什麼它在兩種樣式中都不需要?

+0

是不是你在_Transient_風格的類的上下文中反對_Singleton_風格的函數?在類的上下文中調用'this.'在OOP中是很常見的?提前道歉。我可能很想理解你的問題。 – War10ck

+0

是的,除了大多數語言允許它是隱含的,我不明白爲什麼它不能在這裏。 –

+0

哇我的問題被拒絕了。我想知道爲什麼。如果可以,我很樂意改進它。 –

回答

6

這是不是這麼多的模塊,因爲它是一個事實,即在第二「的風格,」 name是的AnythingYouLike類的成員,而在第一個「風格」你宣稱它作爲全球空間的一個獨立變量。

this在前一種情況下有意義,當您意識到它正在被該類的特定實例使用來引用它自己的name - this.name時,請閱讀:「我的名字」。

當然在第一個例子中沒有這樣的背景 - 在那裏,你只是在創建name

@ War10ck指出這是一個非常基本的面向對象的事情是正確的。

在回答您的評論:

但在第二個例子中,存在環境(周圍的類聲明)應該是說這個。可以暗示,不是?

Java以這種方式工作(和其他OOP語言一樣),並且this的語義在TS和Java中差不多。但不,this不能暗示在TS中,它必須是明確的。

請注意,這主要是,因爲的事實是「單一樣式」存在於JS中,因此在TS中被擴展,而在Java中不被擴展。爲了說明這一點,考慮一下,如果我們結合你的例子會發生什麼:

var name = "foo"; 

class AnythingYouLike { 
    name = "bar"; 

    sayHello() { 
    app.showMessage('Hello ' + this.name); // shows: Hello bar 
    app.showMessage('Hello ' + name); // shows: Hello foo 
    } 
} 

namethis.name在這裏既有效引用到兩個不同的值。在Java中沒有類似的構造可以與之抗衡。

+3

但是在第二個例子中,應該表示「this.'的上下文(周圍類聲明)可以隱含,不是? –

+0

@NeilBarnwell好q,看編輯 – drewmoore

相關問題