簡體   English   中英

如何在JavaScript中傳遞多個參數來設置對象屬性的屬性?

[英]How can I pass more than one argument to set attribute of object property in JavaScript?

考慮下面的代碼。

var book = {
    name: "JavaScript Test Book",
    edition: 3,
    year: 2014
};

Object.defineProperty(book, "info", {
    get: function() {
        return "\"" + this.name + "\" edition " + this.edition + " published on " + this.year;
    },
    set: function(info) {
        this.name = info[0];
        this.edition = info[1];
        this.year = info[2];
    }
});

console.log(book.info); //"JavaScript Test Book" edition 3 published on 2014

book.info = ["JavaScript Recipe", 1, 2015];

console.log(book.info); //"JavaScript Recipe" edition 1 published on 2015

所以對於我的set屬性,該函數只接受一個參數,即數組。 這是我知道傳遞多個參數的唯一方法。

有沒有其他方法可以傳遞多個參數? 所以我的設置功能可能是

set: function(name,edition,year) {
    this.name = name;
    this.edition = edition;
    this.year = year;
}

我認為你沒有達到吸氣劑/孵化器的目的。 它不應該像函數一樣工作,即使它是如何實現的。 它應該像普通的屬性一樣工作,但有一些額外的控制,比如拒絕一個值的能力。

對於你正在做的事情,你應該考慮繼續使用一個功能。

以下是更好地使用屬性:

var book = {
    name: "JavaScript Test Book",
    edition: 3,
    _year: 2014 // it'd be best to use a closure to ensure
                // third-party code doesn't have access to
                // your backing store
};

Object.defineProperty(book, "year", {
    get: function() {
        return this._year;
    },
    set: function(v) {
        // Only assign the value if it's numeric
        if ( !isNaN(parseFloat(v)) && isFinite(v) )
            this._year = v;
        else
            throw 'Expecting a numeric value'; // be nice and make debugging easier
    }
});

在定義您的屬性時,遵循最小驚訝原則非常重要。 如果我將一個數組分配給一個屬性,我希望在訪問該屬性時能夠獲得該數組。 將數組分配給屬性並獲取字符串是非常驚人的,肯定會導致很難診斷錯誤。

一般來說,我強烈建議不要在setter中改變一個值。 如果用戶正在為屬性分配值,那么拒絕格式錯誤的值遠比嘗試修復它或以某種方式更改它要好得多。

想象一下,如果運行以下代碼但得到0結果,你會變得多么生氣:

var u = new User();
u.FirstName = "Jon-Paul";
otherUsers.push( u );
// ... a thousand lines later ...
var JPs = otherUsers.filter(function(u){ return u.FirstName === "Jon-Paul"; });

你不知道的是,User對象的作者選擇根據原始值的一些內部業務規則將FirstName屬性改為“JONPAU”。 想象一下,這將是多么困難的調試。 現在想象一下,如果你在分配FirstName屬性時遇到一個簡單的錯誤會有多容易,例如: Error: FirstName must be all caps, contain characters AZ and be no longer than 6 characters.

暫無
暫無

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

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