1. ホーム
  2. javascript

[解決済み] jQuery の extend メソッドに相当する JavaScript の機能

2022-12-17 05:40:55

質問

背景

を受け取る関数があります。 config オブジェクトを引数として受け取る関数があります。 この関数の中で、私はまた default オブジェクトがあります。 これらのオブジェクトはそれぞれ、本質的に関数内の残りのコードに対する設定として働くプロパティを含んでいます。 の中ですべての設定を行う必要がないようにするためです。 config オブジェクトの中ですべての設定を指定する必要がないように、私はjQueryの extend メソッドを使用して新しいオブジェクトを記入します。 settings からのデフォルト値で default オブジェクトで指定されていない場合は config オブジェクトで指定されていない場合は

var config = {key1: value1};
var default = {key1: default1, key2: default2, key 3: default 3};

var settings = $.extend(default, config);

//resulting properties of settings:
settings = {key1: value1, key2: default2, key 3: default 3};

問題点

この機能は素晴らしいのですが、jQueryを使用せずにこの機能を再現したいです。 これをプレーンな古い javascript で行うための、同じくらいエレガントな (またはそれに近い) 手段はあるでしょうか?


編集: 重複しない正当化

この質問は"と重複していません。 どのように私は2つのJavaScriptオブジェクトのプロパティを動的にマージすることができますか? という質問です。その質問は、単に2つの別々のオブジェクトからすべてのキーと値を含むオブジェクトを作成したいのですが、私は特に、両方のオブジェクトがすべてのキーではなく一部を共有している場合にこれを行う方法と、重複するキーがある場合に結果のオブジェクトに優先(デフォルト)されるオブジェクトを対処したいのです。さらに具体的には、これを実現するためにjQueryのメソッドを使用することと、jQueryを使用せずにこれを実現する代替方法を見つけたいと考えていました。 両方の質問に対する答えの多くは重複していますが、質問自体が同じであることを意味するわけではありません。

どのように解決するのですか?

あなたのコードで結果を得るには、次のようにします。

function extend(a, b){
    for(var key in b)
        if(b.hasOwnProperty(key))
            a[key] = b[key];
    return a;
}

ここでextendを使用した方法は、デフォルトのオブジェクトを変更することに留意してください。 もしそうしたくないのであれば

$.extend({}, default, config)

jQueryの機能を模倣した、より堅牢なソリューションは次のようになります。

function extend(){
    for(var i=1; i<arguments.length; i++)
        for(var key in arguments[i])
            if(arguments[i].hasOwnProperty(key))
                arguments[0][key] = arguments[i][key];
    return arguments[0];
}