如何覆盖传递给函数的对象中的默认参数?
How to override default params in object passed into function?
创建了带有一些参数的 defaultOptions 对象。
const defaultOptions = {
name: 'Adrian',
city: 'Paris',
job: 'Designer',
}
此函数根据参数创建一个句子。
function makeSentence(defaultOptions) {
console.log('My name is ' + defaultOptions.name + ' and I come from ' + defaultOptions.city + ' and I am a ' + defaultOptions.job + '.');
}
当使用 defaultOptions 调用时,它会按如下方式记录到控制台:
makeSentence(defaultOptions);
// My name is Adrian and I come from Paris and I am a Designer.
我想做的是覆盖一些参数以获得如下结果:
makeSentence(defaultOptions, 'Michael');
// My name is Michael and I come from Paris and I am a Designer.
编辑:成功修改 Patrick Roberts 和 Anamul Hasan 的答案
defaultOptions 对象保持不变。
从参数创建句子的函数变为:
function makeSentence(defaultOptions) {
var options = Object.assign({}, defaultOptions, options);
console.log('My name is ' + options.name + ' and I come from ' + options.city + ' and I am a ' + options.job + '.');
}
要覆盖默认参数:
makeSentence({name: 'Michael'}); // overrides only the name attr.
这应该有效。这不会覆盖 defaultOptions,而是复制值并替换它。
makeSentence(Object.assign({},defaultOptions,{name:"Michael"}))
function makeSentence(defaultOptions, nameOverride) {
defaultOptions.name = nameOverride || defaultOptions.name;
console.log('My name is ' + defaultOptions.name + ' and I come from ' + defaultOptions.city + ' and I am a ' + defaultOptions.job + '.');
}
如果你想让它更有活力:
function makeSentence(defaultOptions, property, nameOverride) {
defaultOptions[property] = nameOverride || defaultOptions[property];
console.log('My name is ' + defaultOptions.name + ' and I come from ' + defaultOptions.city + ' and I am a ' + defaultOptions.job + '.');
}
makeSentence(defaultOptions, 'name', 'Micheal');
您可以使用 ES6 默认参数执行此操作:
const defaultOptions = {
name: 'Adrian',
city: 'Paris',
job: 'Designer'
}
const makeSentence = function makeSentence(name = this.name, city = this.city, job = this.job) {
console.log('My name is ' + name + ' and I come from ' + city + ' and I am a ' + job + '.')
}.bind(defaultOptions)
makeSentence()
makeSentence('Michael')
makeSentence('Michael', 'London')
makeSentence('Michael', 'London', 'Programmer')
但是,我认为这样做会更直观,几乎就像默认命名参数一样:
const defaultOptions = {
name: 'Adrian',
city: 'Paris',
job: 'Designer'
}
const makeSentence = function makeSentence({ name = this.name, city = this.city, job = this.job } = {}) {
console.log('My name is ' + name + ' and I come from ' + city + ' and I am a ' + job + '.')
}.bind(defaultOptions)
makeSentence()
makeSentence({ name: 'Michael' })
makeSentence({ name: 'Michael', city: 'London' })
makeSentence({ name: 'Michael', city: 'London', job: 'Programmer' })
创建了带有一些参数的 defaultOptions 对象。
const defaultOptions = {
name: 'Adrian',
city: 'Paris',
job: 'Designer',
}
此函数根据参数创建一个句子。
function makeSentence(defaultOptions) {
console.log('My name is ' + defaultOptions.name + ' and I come from ' + defaultOptions.city + ' and I am a ' + defaultOptions.job + '.');
}
当使用 defaultOptions 调用时,它会按如下方式记录到控制台:
makeSentence(defaultOptions);
// My name is Adrian and I come from Paris and I am a Designer.
我想做的是覆盖一些参数以获得如下结果:
makeSentence(defaultOptions, 'Michael');
// My name is Michael and I come from Paris and I am a Designer.
编辑:成功修改 Patrick Roberts 和 Anamul Hasan 的答案
defaultOptions 对象保持不变。 从参数创建句子的函数变为:
function makeSentence(defaultOptions) {
var options = Object.assign({}, defaultOptions, options);
console.log('My name is ' + options.name + ' and I come from ' + options.city + ' and I am a ' + options.job + '.');
}
要覆盖默认参数:
makeSentence({name: 'Michael'}); // overrides only the name attr.
这应该有效。这不会覆盖 defaultOptions,而是复制值并替换它。
makeSentence(Object.assign({},defaultOptions,{name:"Michael"}))
function makeSentence(defaultOptions, nameOverride) {
defaultOptions.name = nameOverride || defaultOptions.name;
console.log('My name is ' + defaultOptions.name + ' and I come from ' + defaultOptions.city + ' and I am a ' + defaultOptions.job + '.');
}
如果你想让它更有活力:
function makeSentence(defaultOptions, property, nameOverride) {
defaultOptions[property] = nameOverride || defaultOptions[property];
console.log('My name is ' + defaultOptions.name + ' and I come from ' + defaultOptions.city + ' and I am a ' + defaultOptions.job + '.');
}
makeSentence(defaultOptions, 'name', 'Micheal');
您可以使用 ES6 默认参数执行此操作:
const defaultOptions = {
name: 'Adrian',
city: 'Paris',
job: 'Designer'
}
const makeSentence = function makeSentence(name = this.name, city = this.city, job = this.job) {
console.log('My name is ' + name + ' and I come from ' + city + ' and I am a ' + job + '.')
}.bind(defaultOptions)
makeSentence()
makeSentence('Michael')
makeSentence('Michael', 'London')
makeSentence('Michael', 'London', 'Programmer')
但是,我认为这样做会更直观,几乎就像默认命名参数一样:
const defaultOptions = {
name: 'Adrian',
city: 'Paris',
job: 'Designer'
}
const makeSentence = function makeSentence({ name = this.name, city = this.city, job = this.job } = {}) {
console.log('My name is ' + name + ' and I come from ' + city + ' and I am a ' + job + '.')
}.bind(defaultOptions)
makeSentence()
makeSentence({ name: 'Michael' })
makeSentence({ name: 'Michael', city: 'London' })
makeSentence({ name: 'Michael', city: 'London', job: 'Programmer' })