1

私はたくさんの読書をしました。私はたくさんのダミーコードを書きました。JavaScript の継承を完全に征服しようとしたときと同じように、私はまだ混乱しています。たぶんもっとそうです。

私は非常に感心してBackbone.jsおり、コレクションの使用が気に入りました。だから私はソースを読んで、インスピレーションを感じました。しかし、私は継承とオブジェクトの拡張でつまずき続けています。

これは、継承を使用するJavascriptクラスを推測できる限りですが、この使用目的では、extendを使用する利点はわかりません。

    function Collection(){
        this._models = [];
    }

    Collection.prototype = {

        models: function() {
            return this._models;
        },

        fetch: function() { 
            console.log("TODO Override fetch method"); 
        },

        add: function(model){
            this._models.push(model);
            $(this).triggerHandler("add", model);
        },
    }

    function Employees(){}

    Employees.prototype = new Collection();

    Employees.prototype.fetch = function(){
        this._models = [new Person("Ron", "male"), new Person("Stevie", "female"),  new Person("David Blunkett", "female")];
    }

Collectionsuper classes( )_modelsプロパティに直接アクセスするのは少し奇妙に感じますEmployeesが、機能します。このアプローチに問題はありますか?落とし穴や注意事項はありますか?私はこれを使ってアプリケーションを構築したくありません。

おそらく注目に値する編集PersonaModelも a です...

function Model(){}

Model.prototype = {
    get: function(attr){
        return this.attr;   
    },
    set: function(attr, value){
        return this[attr] = value;
    }
}

function Person(name, gender){
    this.name = name;
    this.gender = gender;
}

Person.prototype = new Model();
4

1 に答える 1

1

親クラスの新しいインスタンスを作成し、それを子クラスのプロトタイプとして割り当てるというあなたのアプローチは、Douglas Crockford が JavaScript の継承に対する「疑似古典的」アプローチと呼んでいるものです。この詳細なビデオをチェックしてください。彼は疑似古典的、プロトタイプ的、および寄生的な継承アプローチといくつかのバリアントについて詳しく説明しています。(擬似古典は約12分です)。

あなたのアプローチは、このパターンでコンストラクターコードを共有できないという1つの(潜在的に大きな)制限でうまく機能します(少なくとも余分な空想がなければ)。したがって、次のようにします。

var e = new Employees();
console.log(e.constructor);

Collectionより直感的な関数ではなく、関数が表示されEmployeesます。もう一度、そのビデオを見てください。このトピック全体を非常に明確にカバーしています。

于 2012-11-27T15:49:21.743 に答える