私はいくつかのデフォルトプロパティを持つJSクラスを持っています。デフォルトオブジェクトとデフォルトオブジェクトをオーバーライドするオプションオブジェクトを渡すことができます。私はこれを達成するために私のコンストラクタでlodashのextend
メソッドを使用しています。lodashのextendメソッドを使用してJSオブジェクトインスタンスを拡張すると奇妙な結果が発生します
デフォルトのプロパティの1つが配列です。最初のインスタンスをインスタンス化して配列に新しい値をプッシュすると、2番目のオブジェクトをインスタンス化すると、デフォルトの配列には最初のインスタンスにプッシュされたオブジェクトが含まれます。
例えば、このコードを取る
...MyClass = (function() {
var defaults = {
myArr: [],
myProp: 'I\'m a default value'
};
function MyClass(options) {
// console.log(defaults)
if(typeof options === 'object') {
return _.extend(this, defaults, options);
}
else {
return _.extend(this, defaults);
}
}
return MyClass;
})();
var myObj = new MyClass({foo: 'bar'})
myObj.myArr.push('baz')
var mySecondObj = new MyClass();
console.log(mySecondObj) // MyClass {myArr: Array[1]}
私はmySecondObj.myArr
は空の配列であることを期待しています。
myObj.myArr
に値をプッシュすると、どういうわけかdefaults.myArr
が変更され、クラスの後続のインスタンスに使用されますか?
ありがとうございます。これは、閉鎖に関するコメントに加えて、理にかなっています。 –