簡體   English   中英

具有公共getter和setter方法的JavaScript對象

[英]JavaScript object with public getter and setter methods

昨天,我發布了有關原型繼承和構造函數的文章 我最終選擇了一種方法,該方法可使代碼保持整潔,並以可能對性能造成較小影響為代價而將原型留給他人:

function Card(value) {
    // setValue is a public instance method
    this.setValue = function (val) {
        if (!range[val]) {
            val = drawRandom();
        }

        // value is a public instance variable
        this.value = val;

        return val;
    };

    this.setValue(value);
}

但是,這種方法的問題在於,每當我想要設置Card實例的值來進行驗證時,都必須調用setValue方法。 我想做的是有一個自定義的setter方法。 這是我到目前為止的內容:

function Card(val) {
    // value is a private instance variable
    var value;

    // This is a private instance method
    // It's also self-invoking, but that's beside the point
    (function (x) {
        if (!range[x]) {
            x = drawRandom();
        }

        value = x;
    }(val));

    this.__defineGetter__("value", function () {
        return value;
    });

    // Some code duplication
    this.__defineSetter__("value", function (x) {
        if (!range[x]) {
            return false;
        }

        value = x;

        return x;
    });
}

這很好。 調用var card = new Card()會給我一個具有隨機值的實例,而調用card.value = null失敗,因為它超出了范圍。

除了明顯更長的事實,我的問題還在於,似乎我正在復制某些代碼。 如果將setter方法與構造函數一起調用會很好。 這樣,我可以消除整個自調用私有實例方法。

函數是Javascript中的一流對象,因此您完全可以執行以下操作來消除重復:

function setter (x) {
    if (!range[x]) {
        return false;
    }
    return x;
}
(function (x) {
    value = setter(x);
    if (!value) {
        value = drawRandom();
    }

}(val));

this.__defineGetter__("value", function () {
    return value;
});

// Some code duplication
this.__defineSetter__("value", setter);

首先,您應該始終使用obj.value = newValue設置value ,即使在內部也要設置,因為它會調用您的驗證。 在構造函數中時,這意味着:

this.value = val;

但是,如果聲明setter和getter 之前執行此操作,將無法正常工作。 因此,將其移到后面,以便設置器在設置時存在。


這里的工作示例: http : //jsfiddle.net/8tCjm/4/

var drawRandom = function () {
    return Math.floor(Math.random() * 3) + 1;
};

var range = {
    1: 'Ace',
    2: 'Two',
    3: 'Three'
};

function Card(val) {
    var value;

    this.__defineGetter__('value', function () {
        return value;
    });

    this.__defineSetter__('value', function (x) {
        if (range[x]) {
            value = x;
        } else {
            value = drawRandom();
        }

        return value;
    });

    this.value = val;
};

console.log(new Card(1).value); // 1
console.log(new Card(2).value); // 2
console.log(new Card(3).value); // 3

console.log(new Card(987).value); // not 987 (1-3)
​

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM