2015-11-19 403 views
4

我想了解getter和setter在JS上,我似乎無法通過此錯誤。任何人都可以提供任何見解,爲什麼我得到這個錯誤?未捕獲的SyntaxError:Setter必須只有一個形式參數

var book = { 
    year: 2004, 
    edition:1, 
    get newYear(){ 
     return "Hello, it's " + this.year; 
    }, 
    set newYear(y, e){ 
     this.year = y; 
     this.edition = e; 
    } 
}; 

Uncaught SyntaxError: Setter must have exactly one formal parameter

+0

你應該設置參數,而不是兩個。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set – epascarello

回答

4

當您指定setter表示的值時調用setter函數:

var obj = { 
    set a(newVal) { console.log("hello"); } 
} 
obj.a = 1; // will console log "hello" 

正如你可以看到它沒有什麼意義的制定者採取乘參數,但它給你自由操作前的數值設置:

var person = { 
    surname: "John", 
    lastname: "Doe", 
    get fullname() { 
    return this.surname + " " + this.lastname; 
    }, 
    set fullname(fullname) { 
    fullname = fullname.split(' '); 
    this.surname = fullname[0]; 
    this.lastname = fullname[1]; 
    } 
}; 

console.log(person.fullname); // "John Doe" 
person.fullname = "Jane Roe"; 
console.log(person.surname); // "Jane" 
console.log(person.lastname); // "Roe" 
+0

這是非常真實的,也是如何使用setter/getters的一個很好的例子,但是您需要通過提供一些解決方案將它與實際問題聯繫起來。 –

4

一個二傳手功能是,當你做的東西像是一個隱式調用功能:

someObject.property = 25; 

因爲賦值操作涉及分配一個且只有一個值,setter函數必須有一個單一的論點。它將永遠只會被一個參數調用(通過隱式賦值機制),所以一個雙參數setter沒有多大意義。

在你的情況,你可以讓你的制定者採取單一的對象,並得到了兩個值出來的:

var book = { 
    year: 2004, 
    edition:1, 
    get newYear(){ 
     return "Hello, it's " + this.year; 
    }, 
    set newYear(value){ 
     this.year = value.y; 
     this.edition = value.e; 
    } 
}; 

那麼你可以說

book.newYear = { y: 2005, e: 2 }; 

(我個人覺得我d傾向於使用解構賦值來做到這一點,但它可以工作。)

+0

實際上也許解構賦值*不能*做到這一點 - 可以嗎?我覺得自己不記得「節奏」這個詞是否真實。 – Pointy

+0

我會在這種情況下不使用屬性,只是一個名爲'setNewYear(y,e)'的方法。我不能把我的手指放在它上面,但像這樣的二傳手似乎不是他們通常使用的方式。我也想到了解構作業,但在這種情況下無法弄清楚如何使用它。 –

+0

@JuanMendes是的,我同意,我不會這樣做。我主要是在設計一個例子。 – Pointy

0

嘗試setNewYear而不是設置newYear和getNewYear不會變爲newYear。

+0

問題是關於ES2015的語法和語義。 – Pointy

相關問題