0

私のグループのプロジェクトで一般的に使用される 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
}

だから私の質問は、ここで正確に何が起こっているのですか? オブジェクト (この場合はコンポーネント) が、期待するプロパティ/関数にアクセスできないのはなぜですか? これは、メモ化されたクロージャーを使用してライブラリを定義しているという事実と関係がありますか? このライブラリから初期化されたオブジェクトがこれらのプロパティ/関数にアクセスできるようにするにはどうすればよいですか?

4

1 に答える 1

1

関数のプロトタイプを使用して、インスタンス メソッドを定義します。

    _componentName.prototype.addObject = function (args) {
        // Add an object...
    };

    _componentName.prototype.removeObject = function (args) {
        // Remove an object...
    };

オブジェクトで直接定義されている場合、_componentName のインスタンスに渡されない _componentName プロパティを呼び出しているため、スクリプトは機能しません。プロトタイプの継承を使用して新しい平均を使用することを忘れないでください。Javascript にはクラスベースの継承がありません。

于 2013-02-23T18:57:07.617 に答える