Я программист на С++, который недавно приземлился на мир JavaScript; теперь я пытаюсь применить некоторые шаблоны дескриптора С++ к JavaScript ради моего понимания и психического здоровья.
AFAIK, следующие коды являются эквивалентными в С++ и Javascript:
С++
// Class definition
template <typename T> class foo
{
public:
// Constructor
foo(T value) { this->value = value; }
// Public function
T twice() { return this->value + this->value; }
private:
// Private function
void bar() { }
// Private member
T value;
};
JavaScript
// "Class" definition and constructor
function foo(value)
{
// "Private" member
this.value = value;
// "Private" function
this.bar = function() { };
}
// Public function
foo.prototype.twice = function() { return this.value + this.value; };
Использование обоих классов тоже похоже:
С++ живая демонстрация
foo<int> f1(1);
foo<std::string> f2("1");
std::cout << f1.twice() << '\n'; // output: 2
std::cout << f2.twice() << '\n'; // output: 11
JavaScript живая демонстрация
var f1 = new foo(1);
var f2 = new foo('1');
print(f1.twice()); // output: 2
print(f2.twice()); // output: 11
Но есть вещь, которая не может быть выполнена с классом JavaScript и возможно сделать с классом С++: использование временного RValue для выполнения задачи:
С++
std::cout << foo<float>(3.14f).twice() << '\n'; // output: 6.28
JavaScript
print(foo(3.14).twice()); // Uncaught TypeError: undefined is not a function
Я думаю, что ошибка в версии JavaScript связана с тем, что foo является функцией и ничего не возвращает (undefined
), поэтому сначала я думал об изменении конструктора с помощью кода ниже:
JavaScript
// "Class" definition and constructor
function foo(value)
{
// "Private" member
this.value = value;
// "Private" function
this.bar = function() { };
return this; // <----- new code!
}
Но это не работает вообще; объект, возвращаемый командой return this;
, не имеет тип foo
(foo(3.14) instanceof foo
is false
).
При отладке в Chrome 35.0.1916.114 тип this
в инструкции return this;
равен foo
, но тип изменяется на window
в этой ситуации:
var x = foo(3.14); // x is typeof window
После того, как вы сделали ввод, здесь возникают вопросы:
- Почему тип
this
foo
внутри конструктора иwindow
при захвате снаружи?- Потому что оператор
new
не используется?
- Потому что оператор
- Есть ли способ создать объекты JavaScript, которые ведут себя как С++ RValues?