简体   繁体   English

如何覆盖传递给函数的对象中的默认参数?

[英]How to override default params in object passed into function?

A defaultOptions objects with some params is created. 创建带有一些参数的defaultOptions对象。

const defaultOptions =  {
  name: 'Adrian',
  city: 'Paris',
  job: 'Designer',
}

This function creates a sentence from the params. 此函数根据参数创建一个句子。

function makeSentence(defaultOptions) {
  console.log('My name is ' + defaultOptions.name + ' and I come from ' + defaultOptions.city + ' and I am a ' + defaultOptions.job + '.');
}

When called with defaultOptions it logs to the console as follows: 当使用defaultOptions调用时,它将记录到控制台,如下所示:

makeSentence(defaultOptions);
// My name is Adrian and I come from Paris and I am a Designer.

What I'd like to be able to do is to override some of the params to get a result like: 我想做的是重写某些参数以获得类似以下结果:

makeSentence(defaultOptions, 'Michael');
// My name is Michael and I come from Paris and I am a Designer.

EDIT: Success with modification of Patrick Roberts' and Anamul Hasan's answers 编辑:成功修改了Patrick Roberts和Anamul Hasan的答案

defaultOptions object remains the same. defaultOptions对象保持不变。 Function to create a sentence from params becomes: 根据参数创建句子的功能变为:

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 + '.');
}

To override default params: 要覆盖默认参数:

makeSentence({name: 'Michael'}); // overrides only the name attr. 

This should work. 这应该工作。 This won't override defaultOptions, instead it will copy the value and replace it. 这不会覆盖defaultOptions,而是将复制值并将其替换。

makeSentence(Object.assign({},defaultOptions,{name:"Michael"}))

You could do this using ES6 default parameters: 您可以使用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') 

However, I'd argue it would be more intuitive to do this, almost like default named parameters: 但是,我认为这样做会更直观,几乎就像默认的命名参数一样:

 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' }) 

 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 + '.');
 }

If you want it more dynamic: 如果您希望它更具动态性:

 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');

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM