考虑下面的代码。
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: function(name,edition,year) {
this.name = name;
this.edition = edition;
this.year = year;
}
最佳答案
我认为您不太了解 getter/setter 的用途。它不应该像函数一样工作,即使它是这样实现的。它应该像普通属性一样工作,但有一些额外的控制,比如拒绝值的能力。
对于你正在做的事情,你应该考虑继续使用一个函数。
下面是属性的更好用法:
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
}
});
定义属性时,请务必遵循 principle of least astonishment .如果我将一个数组分配给一个属性,我希望在访问该属性时能取回该数组。将一个数组分配给一个属性并返回一个字符串是非常令人惊讶的,并且肯定会导致非常难以诊断错误。
一般来说,我强烈反对在 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 A-Z and be longer be超过 6 个字符。
关于javascript - 如何在 JavaScript 中传递多个参数来设置对象属性的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29612316/