Другая функция, что шаблоны C++ имеют тот Java дженерики, не делает специализация. Это позволяет Вам иметь другую реализацию для определенных типов. Таким образом, у Вас может, например, быть высоко оптимизированная версия для интервал , все еще имея универсальную версию для остальной части типов. Или у Вас могут быть различные версии для указателя и неуказательных типов. Это пригождается, если Вы хотите воздействовать на разыменованный объект при вручении указателя.
Строки в Javascript уже передаются «по ссылке» - вызов процедуры со строкой не включает копирование содержимого строки. Здесь есть две проблемы:
- это метка, которая применяется к двум совершенно отдельным строковым переменным. Вот один из способов добиться желаемого, используя замыкания для реализации динамической области видимости метрики
:
function Report(a, b) {
this.ShowMe = function() { alert(a() + " of " + b); }
}
var metric = "count";
var metric_fnc = function() { return metric; }
var a = new Report(metric_fnc, "a");
var b = new Report(metric_fnc, "b");
a.ShowMe(); // outputs: "count of a";
metric = "avg";
b.ShowMe(); // outputs: "avg of b";
Вы можете заключить строку в объект и изменить поле, в котором она хранится. Это похоже на то, что вы делаете в последнем примере, только без необходимости изменять функции.
var metric = { str : "count" }
metric.str = "avg";
Теперь metric.str будет содержать «avg»
Закрытие?
var metric = new function() {
var _value = "count";
this.setValue = function(s) { _value = s; };
this.toString = function() { return _value; };
};
// snip ...
a.ShowMe();
metric.setValue("avg");
b.ShowMe();
c.ShowMe();
или сделать его немного более универсальным и производительным:
function RefString(s) {
this.value = s;
}
RefString.prototype.toString = function() { return this.value; }
RefString.prototype.charAt = String.prototype.charAt;
var metric = new RefString("count");
// snip ...
a.ShowMe();
metric.value = "avg";
b.ShowMe();
c.ShowMe();
Если вы не закрываете нужную строковую переменную, то я полагаю, что единственным другим способом будет измените функцию ShowMe, как в ответе @John Millikin, или измените архитектуру базы кода.
Если вы передадите переменную как объект, она будет работать, поскольку объекты передаются по ссылке в Javascript.
http://sirdarckcat.blogspot.com/2007/07/passing-reference-to-javascript.html
function modifyVar(obj,newVal){
obj.value=newVal;
}
var m={value: 1};
alert(x);
modifyVar("x",321);
alert(x);
В JavaScript строки неизменяемы. Вы не можете изменить саму строку, если у экземпляров Report
есть дескриптор.
ваше решение работает, но это может быть проще:
function Report(a, b) {
this.showMe = function() { alert(a.str + " of " + b); }
}
var metric = {};
metric.str = "count";
a.Showme();
metric.str = "avg";
b.ShowMe();