我只是JavaScript的新手。我想写一个像C ++这样的JS模板类。例如:
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中,它是如何解释的?非常感谢。
答案 0 :(得分:4)
Javascript不需要模板来处理泛型类型,因为Javascript是dynamically typed language。这意味着在Javascript中,函数可以接受任何类型的参数。
要在问题中实现与示例模板相同的功能,您可以使用对象文字来使用这个(更短的)Javascript代码:
var A = {
print: function(value) {
document.write(value);
}
}
这可以这样使用:
A.print(2);
您可以在JsFiddle上看到此代码示例。
如果您希望代码与C ++更紧密地对应,您可以使用函数来使用此方法:
var A = function(value) {
return {
print: function() {
document.write(value);
}
}
}
可以这样使用:
var test = A(2);
test.print();
您可以在JsFiddle上看到这一点。
答案 1 :(得分: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
是构造函数用于模板(原型对象)。
答案 2 :(得分: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();