Ser*_*hiy 10 javascript string function
这可能还是我在这里咆哮错了?
var data = 'one';
function fnc(){
this.out = function(){
return data;
}
}
var instance = new fnc();
alert(instance.out);
data = 'two';
alert(instance.out);
// I know that this would achieve that, but that's not what I would like to know.
alert(instance.out());
data = 'two';
alert(instance.out());
Run Code Online (Sandbox Code Playgroud)
更新:
应该表示fnc的对象实际上是Sarissa dom文档.这是fnc(),dom_doc()的更精细版本.以下接受的答案已集成到下面的功能中.
function get_doc(dom_node) {
var doc;
if (navigator.userAgent.indexOf("MSIE") >= 0) {
doc = new ActiveXObject("Msxml2.DOMDocument.3.0");
doc.loadXML(document.getElementById(dom_node).text);
}
else {
doc = Sarissa.getDomDocument();
doc = (new DOMParser()).parseFromString(document.getElementById(dom_node).textContent, "text/xml");
// runs XSLTProcessor in modern browsers as if it was trasformNode
doc.transformNode = function (stylesheet) {
var processor = new XSLTProcessor();
processor.importStylesheet(stylesheet);
return new XMLSerializer().serializeToString(processor.transformToDocument(this));
}
// allows modern browsers to extract xml the way the legacy IEs did
var getXML = {};
getXML.toString = function(){
return new XMLSerializer().serializeToString(doc);
};
doc.xml = getXML;
}
return doc;
}
Run Code Online (Sandbox Code Playgroud)
演示: JSFIDDLE
你似乎在谈论一个getter方法.如果这就是你的意思,你可以使用这个:
var data = 'one';
function fnc(){
Object.defineProperty(this, 'out', {
get : function(){ return data; }
});
}
var instance = new fnc();
alert(instance.out);
Run Code Online (Sandbox Code Playgroud)
这与旧版浏览器不兼容(请参阅本页底部的兼容性表).
此外,使用getter获取全局变量有点奇怪.通常使用它来获取实例对象上的私有变量的值,在这种情况下,您只能使用相应的setter修改它.
不过,这些类型的解决方法确实绕过了惯例。仅在您的功能上使用它不应该成为太大的障碍()。使用()预期的、可读的、最佳实践和行业标准。
不知道为什么smartcaveman决定删除他的使用答案,toString但这是一种可行的方法,尽管有点黑客。
var data = 'one';
function fnc(){
var getData = {};
getData.toString = function(){
return data;
};
this.out = getData;
}
var instance = new fnc();
alert(instance.out);//one
data = 'two';
alert(instance.out);//two
var s = instance.out;
alert(s);//two
Run Code Online (Sandbox Code Playgroud)