私のグループのプロジェクトで一般的に使用される UI コンポーネントの JavaScript ライブラリを作成しようとしています。ライブラリを定義する次のコードがあります。
var libName = function() {
var _libName = this;
_libName.componentName = function () {
// Some Private Variables
var _componentName = function (args) {
// Construct the object...
};
_componentName.addObject = function (args) {
// Add an object...
};
_componentName.removeObject = function (args) {
// Remove an object...
};
return _componentName;
}();
return _libName;
}();
これをページで使用してコンポーネントを作成するときは、次のコードを呼び出します。
var component = new libName.componentName(args);
それは問題なく初期化され、私が期待する基本コンポーネントを作成します。コンポーネントにデータを追加したいので、次の関数を呼び出します。
component.addObject(someObject);
しかし、期待どおりに関数を呼び出す代わりに、コンポーネント オブジェクトにプロパティ「addObject」がないと表示されます。私は次のコードでこれを調べました。
if (libName.componentName.addObject) {
console.log("libName.componentName.addObject exists"); // Logs
}
if (component.addObject) {
console.log("component.addObject exists"); // Doesn't log
}
if (component.constructor.addObject) {
console.log("component.constructor.addObject exists"); // Logs
}
だから私の質問は、ここで正確に何が起こっているのですか? オブジェクト (この場合はコンポーネント) が、期待するプロパティ/関数にアクセスできないのはなぜですか? これは、メモ化されたクロージャーを使用してライブラリを定義しているという事実と関係がありますか? このライブラリから初期化されたオブジェクトがこれらのプロパティ/関数にアクセスできるようにするにはどうすればよいですか?