2016-06-27 4 views
-3

Я пытаюсь создать плагин с настройками. Там будут настройки по умолчанию и пользовательские настройки. Мне придется как-то объединить эти два в object. Я попытался следующие:Слить значение по умолчанию с пользовательскими настройками

JSFiddle

function MyPlugin(options) { 
 
    if (typeof optoins === null || typeof options !== 'object') options = {}; 
 

 
    var defaults = { 
 
     prop1: true, 
 
     prop2: false, 
 
     prop3: 0, 
 
     prop4: 100, 
 
    } 
 
    // Set default options 
 
    for (var name in defaults) { 
 
    !(name in options) && (this.options[name] = defaults[name]); 
 
    } 
 
} 
 
var test = new MyPlugin();

Но я получаю сообщение об ошибке сказав:

Uncaught TypeError: Cannot set property 'prop1' of undefined

Что я делаю не так, и как я могу это исправить?

+0

'this.options', вероятно, следует' options'. Также как 'optoins'. И 'typeof' всегда возвращает строку, которая является' 'объектом '' для 'null'. – Oriol

+2

'this.options'! ==' options'. Кроме того, 'typeof optoins === null' не имеет смысла. Может быть, просто: '! Options || typeof options! == 'object'' –

+0

@ AlexanderO'Mara Спасибо! Я не совсем понимаю, что делать с 'this.options! == options' – Jessica

ответ

0

Я думаю, вы могли бы посмотреть на что-то вроде этого.

function MyPlugin(options) { 
    options = options || {}; 

    if (typeof userOpt !== 'object') { 
     options = {}; 
    } 

    var defaults = { 
     prop1: true, 
     prop2: false, 
     prop3: 0, 
     prop4: 100 
    }; 

    // Set default options 
    for (var name in defaults) { 
     defaults[name] = options.hasOwnProperty(name) ? options[name] : defaults[name]; 
    } 
} 

MyPlugin({ 
    prop1: false, 
    prop4: 300 
}); 

Так что, если MyPlugin() вызывается с null тогда userOpt будет пустой объект {}.

Выход:

{"prop1":false, "prop2":false, "prop3":0, "prop4":300} 

.hasOwnProperty просто проверяет, если он установлен пользователем или нет, если да, то идти с опцией пользователя в противном случае сделать по умолчанию.

hasOwnProperty: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

Every object descended from Object inherits the hasOwnProperty method. This method can be used to determine whether an object has the specified property as a direct property of that object; unlike the in operator, this method does not check down the object's prototype chain.

+0

Параметр «typeof options! ==» объекта OP не является плохой идеей, потому что функция может быть (неправильно) вызвана со строкой или номером. – nnnnnn

+0

Имеют смысл, я включу эту проверку. –

+0

Спасибо за ответ! Какой смысл создавать 'userOpt', разве мы не можем использовать' option'? Что-то вроде этого: 'option = option || {} ' – Jessica

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