是否有可能使JavasScript函数表现得好像它是一个字符串,没有()

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

bfa*_*tto 9

你似乎在谈论一个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)

http://jsfiddle.net/zztYd/1

这与旧版浏览器不兼容(请参阅本页底部的兼容性表).

此外,使用getter获取全局变量有点奇怪.通常使用它来获取实例对象上的私有变量的值,在这种情况下,您只能使用相应的setter修改它.

  • 为什么不将属性定义*放在*构造函数中,就像OP有它一样? (2认同)

Tra*_*s J 3

jsFiddle Demo

不过,这些类型的解决方法确实绕过了惯例。仅在您的功能上使用它不应该成为太大的障碍()。使用()预期的、可读的、最佳实践和行业标准。

不知道为什么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)

  • @JuanMendes - 我相信当你做出这些陈述时,你歪曲了“精神”。请阅读meta上的这篇文章:http://meta.stackexchange.com/a/5235/178816,并在meta上发表一篇关于您关于“SO精神”的问题的文章,然后再全面了解stackoverflow是或不是,或者开始规定OP应该或不应该接受什么。请注意其中的部分:“最重要的是,您应该接受您认为对您个人最有帮助的答案。” (2认同)