2015-11-19 10 views
4

Я пытаюсь понять геттеры и сеттеры на JS, и я не могу пропустить эту ошибку. Может ли кто-нибудь дать понять, почему я получаю эту ошибку?Uncaught 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 вызывается, когда вы назначаете значение, которое представляет сеттер:

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

Это очень верно и хороший пример того, как использовать сеттеры/геттеры, но вам нужно связать это с реальным вопросом, предложив какое-то решение. –

4

сеттер функция является функцией, которая называется неявно, когда вы делаете что-то вроде:

someObject.property = 25; 

Поскольку операция присваивания включает в себя назначение одного и только одно значение, функция сеттер должна имеют один аргумент. Он будет когда-либо вызван (через механизм неявного присваивания) с одним аргументом в любом случае, поэтому средство с двумя аргументами имеет мало смысла.

В вашем случае, вы могли бы сделать ваш сеттер взять один объект и получить два значения из него:

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

Try setNewYear и не установить newYear и то же самое для getNewYear не получить newYear.

+0

Вопрос о синтаксисе и семантике ES2015. – Pointy

Смежные вопросы