10

これは可能ですか、それともここで間違ったツリーを吠えていますか?

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());

アップデート:

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;
}

デモ: JSFIDDLE

4

3 に答える 3

9

あなたはゲッターメソッドについて話しているようです。それがあなたの言いたいことなら、これを使うことができます:

var data = 'one';
function fnc(){
    Object.defineProperty(this, 'out', {
        get : function(){ return data; }
    });
}
var instance = new fnc();

alert(instance.out);

http://jsfiddle.net/zztYd/1

これは、古いブラウザとは互換性がありません (このページの下部にある互換性表を参照してください)。

また、ゲッターを使用してグローバル変数を取得するのは少し奇妙です。通常、これを使用してインスタンス オブジェクトのプライベート変数の値を取得します。その場合、対応するセッターでのみ変更できます。

于 2013-05-09T22:44:34.863 に答える