2011-08-08 25 views
4

我只是一個JavaScript的新手。我想寫一個類似C++的JS模板類。例如:如何編寫JavaScript模板類?

template <typename T> 
class A 
{ 
public: 
    A(T x) 
    { 
     this.a=x; 
    } 
    ~A() 
    { 

    } 
    void print() 
    { 
     std::cout<<a<<std::endl; 
    } 
private: 
    T a; 
}; 

我們可以使用這個類是這樣的:

A<int> test(2); 
test.print(); 

對於C++,這很簡單。但在JS中,它是如何解釋的?非常感謝。

+3

你爲什麼要一個模板類使用在動態類型的語言? – aroth

+0

我只是將C++代碼翻譯成JS代碼,然後來解決這個問題。這種翻譯有什麼方法嗎? – greatsea

回答

2

你可以這樣做:

var A = function (x) { 
    var a = x; 
    this.print = function() { 
     console.log(a); 
    }; 
}; 

var test = new A(2); 
test.print(); // -> 2 

在這種情況下,變量a是私有的,功能print是公共的(因爲是this任何其他財產)和A是模板的構造函數(原型對象)。

+0

也許它有效,但使用這種方法不能反映'模板'。沒有其他方法,也許這是一個好方法。謝謝.. – greatsea

4

由於Javascript是dynamically typed language,Javascript不需要模板來處理泛型。這意味着在Javascript中,函數可以接受任何類型的參數。

要實現相同的功能在你的問題的示例模板,您可以使用對象文本的Javascript代碼使用這個(更短):

var A = { 
    print: function(value) { 
    document.write(value); 
    } 
} 

這可以用於像這樣:

A.print(2); 

您可以在JsFiddle上看到此代碼sampe的行動。

如果你想要的代碼更緊密地對應於C++,你可以使用一個函數,而不是使用這種方法:

var A = function(value) { 
    return { 
    print: function() { 
     document.write(value); 
    } 
    } 
} 

這可以這樣使用:

var test = A(2); 
test.print(); 

你可以在JsFiddle上查看此操作。

+0

我明白了。謝謝你和mVChr :) – greatsea

0

那麼在你的情況,因爲模板參數是一個類型,你不需要在Javascript中反映它。

但是,如果你有這樣的事情一個函數指針

typedef bool (*C) (const int&, const int&); 

template<C c> 
class my_class{ 

public: 
    void my_method(){ 
     // use c 
     // ... 
    } 

}; 

你可以把它翻譯成

var my_class_t = function(c){ 

    var my_class = function(){ 
    }; 

    my_class.prototype.my_method = function(){ 
     // use c 
     // ... 
    }; 

    return my_class; 
}; 

而且如下

var my_class = my_class_t(function(a, b){return a < b;}); 
var my_instance = new my_class(); 
my_instance.my_method();