2

まず最初に、coffeescript サイトから動物の例を取り上げました。

javascript で次のことをシミュレートしたい:

  • クラス
  • パブリック メソッドのみ
  • プライベート メソッドと変数のみ
  • 継承
  • スーパークラスからメソッドを呼び出す

これを作成するこの方法は問題ないと思いますがmove、親クラスからメソッドを取得しようとすると、常にそれ自体に戻ります。私が間違っていることは何ですか?

ところで。目標を達成するためのベスト プラクティスはどれですか? 私がしていることは正しいですか?

var Animal = (function() {
    function Animal() {}

    var _private = {};
    var _public = {
        move: function() {
            console.log('Can move');
        }
    };

    Animal.prototype = _public;
    Animal.prototype.constructor = Animal;
    return Animal;
})();

var Snake = (function(_super) {
    function Snake() {}

    var _private = {};
    var _public = {
        move: function() {
            console.log(Snake._super_.move);
            console.log('Slithering');
        }
    };

    Snake.prototype = _super.prototype;
    Snake._super_ = _super.prototype;
    for(var method in _public) {
        if(Object.prototype.toString.call(_public[method]) === '[object Function]') {
            Snake.prototype[method] = _public[method];
        }
    }
    return Snake;
})(Animal);

var s = new Snake;
s.move();
4

2 に答える 2

3

ベストプラクティスを求めている場合は、Web上ですぐに使用できるソリューションを利用してください。私はこれが好きです:http://canjs.us/#can_construct

あなたのアプローチに関するいくつかの通知:

  1. 再利用できません。すべてのクラスに同じコードを記述する必要があります。少なくとも、このコードを再利用できるようにするには、forループを抽出する必要があります。
  2. _public.hasOwnProperty(method)コードをより堅牢にするためにチェックする必要があります。
  3. toStringまた、valueOfメソッドはIE <9では列挙できないため、特別な処理が必要です。
  4. Snake.prototype = _super.prototype;完全な災害です。あなたのスーパークラスは子のすべてのメソッドを持っているので。

    var F = function(){};
    F.prototype = _super.prototype;
    Snake.prototype = new F();
    Snake.prototype.constructor = Snake;
    
于 2012-11-21T21:31:05.737 に答える
3

私の意見では、これは非常によく書かれたコードですが、1 つだけ小さな間違いがあります。

ポインタが少し交差していると思います。これを試してください:

<script>
var Animal = (function () {
    function Animal() { }

    var _private = {};
    var _public = {
        move: function () {
            console.log('Can move');
            //this just returns a string to show which method was called
            //inside of the child's move function's console.log
            return "super move called";
        }
    };

    Animal.prototype = _public;
    Animal.prototype.constructor = Animal;
    return Animal;
})();

var Snake = (function (_super) {
    function Snake() { }

    var _private = {};
    var _public = {
        move: function () {
            console.log(Snake._super_.move());//Now we can call super's move
            console.log('Slithering');
        }
    };

    //This created the circular reference where Snake._super_ was pointing to
    //Snake.prototype which was causing the error
    //Snake.prototype = _super.prototype;
    Snake._super_ = _super.prototype;

    for (var method in _public) {
        if (Object.prototype.toString.call(_public[method]) === '[object Function]') {
            Snake.prototype[method] = _public[method];
        }
    }
    return Snake;
})(Animal);

var s = new Snake;
s.move();//now this outputs "Can move", "super move called", "Slithering"
</script>
于 2012-11-21T20:42:42.893 に答える