2016-03-20 4 views
2

Я настраиваю конструктор объектов и хотел бы передать объект key/value в качестве параметра. Мне было интересно, что будет правильным способом? Сейчас я просто мимо клавиш в качестве параметров:Передача объектов ключа/значения в качестве параметра в конструкторе Javascript

(function() { 
    function Venue(name, poor, satisfactory, excellent) { 
     this.name = name; 
     this.serviceRatings = { 
      poor: poor, 
      satisfactory: satisfactory, 
      excellent: excellent 
     }; 
    } 

    var dining = new Venue("dining", .1, .15, .2); 

    console.log(dining["serviceRatings"]["satisfactory"] // .15 
}()); 

Хотя это работает, выходя из фона Руби это только было правильно передать сам объект и присвоить ценности это в инициализаторе. Это был лучший эквивалент, который я мог придумать:

class Venue 
    def initialize(name, serviceRatings = {}) 
    @name = name 
    @poor = serviceRatings[:poor] 
    @satisfactory = serviceRatings[:satisfactory] 
    @excellent = serviceRatings[:excellent] 
    end 
end 

Есть ли способ сделать это на Javascript? То, как я теперь писал вещи, заставляет меня чувствовать, что я раздуваю список параметров своего конструктора (если это - - правильный способ сделать это).

+0

может пройти в одном аргумент объекта вместо нескольких примитивов, если это то, о чем вы просите. Не совсем понятно, что вы хотите делать – charlietfl

ответ

2

Вы можете передать объект так же, как в рубиновом классе.

function Venue(name, options) { 
    this.name = name; 
    this.serviceRatings = options; 
} 

var dining = new Venue("dining",{ 
     poor: .1, 
     satisfactory: .15, 
     excellent: .2 
    }); 

Выше будет создаваться тот же результат, что и раньше. Стоит отметить, что ECMAScript 2015 принес классы JavaScript - так можно было бы написать так:

class Venue { 
    constructor(name, options = {}) { 
     this.name = name; 
     this.serviceRatings = options; 
    } 
} 

Выше мы используем пустой объект как default parameter, который также является особенностью es2015.

Если вы хотите, чтобы имена клавиш по умолчанию, то, как это будет сделать

class Venue { 
    constructor(name, options = {}) { 
     this.name = name; 
     this.serviceRatings = Object.assign({ 
      poor: undefined, 
      satisfactory: undefined, 
      excellent: undefined 
     }, options); 
    } 
} 
+0

Для примера, есть ли способ записать имена ключевых слов по умолчанию в объекте 'options'? Просто любопытно. –

+0

Да, отредактировал мой ответ @CarlEdwards - это будет работать в обоих примерах, но имейте в виду, что Object.assign не имеет лучшей поддержки браузера, поэтому вам может понадобиться полилизовать его в зависимости от среды, в которой вы работаете, в – baao

+0

Спасибо. Я надеюсь, что больше браузеров скоро поддержит второй метод. Гораздо удобнее. –

0

аргументы будут содержать все параметры, переданные функции как список.

(function() { 
    function Venue() { 
     console.log(arguments); 
    } 

    var dining = new Venue("dining", .1, .15, .2); 

}()); 
2

Вы имеете в виду что-то вроде этого?

(function() { 
     function Venue(name, serviceRatings) { 
      this.name = name; 
      this.serviceRatings = serviceRatings; 
     } 

     var dining = new Venue("dining", { 
      poor:.1, 
      satisfactory:.15, 
      excellent:.2 
     }); 

     console.log(dining["serviceRatings"]["satisfactory"]) // .15 
    }()); 
1

Как уже отмечалось, можно передать объект в качестве аргумента.

// naive ES5 version 
function Venue(name, serviceRatings) { 
    this.name = name; 
    this.serviceRatings = serviceRatings; 
} 

Проблема с этим наивным подходом заключается в том, что объекты в JavaScript изменяемы. Если вы назначаете объект, как указано выше, ваше состояние объекта может быть мутировано случайно. Например:

var ratings = { poor: 0, satisfactory: 2, excellent: 8 }; 
var diner = new Venue('diner', ratings); 

ratings.poor = 12; 
var burgerJoint = new Venue('my burgers', ratings); 

Здесь вы мутировать рейтинги после закусочной была создана, и вы случайно установили diner.serviceRatings.poor до 12.

Вы можете защитить ваш код от этого путем копирования значений вашего объекта:

// improved with Object.assign 
function Venue(name, serviceRatings) { 
    this.name = name; 
    this.serviceRatings = Object.assign({}, serviceRatings); 
} 

Object.assign() копирует каждое свойство из seviceRatings в {}; таким образом, позже изменения другого объекта не влияют на свойство вашего участника.

Если вы используете ES2015, вы можете использовать деструктурирование объектов, что имеет дополнительные преимущества: он делает вашу ожидаемую структуру данных явной; и позволяет указать значения по умолчанию:

// ES2015 version with explicit parameters and default values 
function Venue(name, { poor = 0, satisfactory = 0, excellent = 0 }) { 
    this.name = name; 
    this.serviceRatings = { poor, satisfactory, excellent }; 
} 

Edit: как показано в другом ответе, если вы используете ES2015, вы могли бы также использовать класс синтаксический сахар:

// ES2015 version using class definition 
class Venue 
    constructor (name, { poor = 0, satisfactory = 0, excellent = 0 }) { 
     this.name = name; 
     this.serviceRatings = { poor, satisfactory, excellent }; 
    }  
} 
Смежные вопросы