2016-06-27 4 views
-3

設定でプラグインを作成しようとしています。デフォルト設定とユーザー定義の設定があります。私はどうにかしてobjectの2つをマージする必要があります。デフォルトをユーザー定義の設定とマージする

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'は常に文字列を返します。これはヌルの' 'オブジェクト ''です。 – 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

OPの 'typeof options!== 'object''テストは、関数が(間違って)文字列や数値で呼び出される可能性があるため、悪い考えではありません。 – nnnnnn

+0

意味が分かります。その小切手を含めます。 –

+0

答えをありがとう! 'userOpt'を作る点は何ですか?単に' option'を使うことはできませんか?このようなもの: 'option = option || {} ' – Jessica

関連する問題