0

javascriptの書き方にはさまざまな見方があることは理解していますが、私が書いている方法がうまくいくかどうか疑問に思いました。誰も理解できないコードを書いている労働力には入りたくありません。

このコードの基本的な前提は、オブジェクトのカスタムイベントハンドラーをテストすることであり、「これを行うべきではない」という明白なタイプのものがあるかどうか疑問に思っていました。

    function EventClass() {
        var self = this;
        var events = {};
        var i = 0;
        self.fire = function(evt, args) {
            for (x in events[evt])
                events[evt][x].call(this, args);
        }

        self.on = function(evt, fn) {
            if (events[evt] == null) {
                events[evt] = []
            }
            events[evt].push(fn);
        }
    };

    function Human(x, y) {
        var self = this;
        self.__proto__ = new EventClass();
        var xCoord = 0;
        var yCoord = 0;

        self.events = {
            "MOVEMENT" : "movement"
        };

        self.init = function(x,y) {
            xCoord = x;
            yCoord = y;
        }

        self.draw = function(context) {
            context.beginPath();
            context.arc(xCoord,yCoord,10,0,Math.PI*2,true);
            context.closePath();
            context.fill();
        }

        self.moveLeft = function() {
            xCoord -= 5;
            self.fire(self.events.MOVEMENT, xCoord);
        }
        self.init(x,y);
    };

    function Player(x, y) {
        var self = this;
        self.__proto__ = new Human();
        self.init(x,y);
    };

    function Canvas(c) {
        var self = this;
        var canvas;
        var context;
        var objects = [];

        self.init = function(c) {
            canvas = c;
            context = canvas.getContext("2d");
        };

        this.redraw = function() {
            context.clearRect(0,0,300,300);
            for (x in objects) {
                objects[x].draw(context);
            }
        }

        this.addObject = function(obj) {
            objects.push(obj);
            obj.on(obj.events.MOVEMENT, function(coord) {
                console.log(coord);
                self.redraw();
            });
        };
        self.init(c);
    }


    var canvas = new Canvas(document.getElementById("canvas"));
    var human0 = new Human(75,75);
    canvas.addObject(human0);
    var human1 = new Human(100,100);
    canvas.addObject(human1);
    var player = new Player(200,200);
    canvas.addObject(player);

    canvas.redraw();
4

1 に答える 1

0

いくつかの小さなこと-ある種。

最初のものは小さいです。

thisと物事と一致してselfいる。私がここで考えている例は、Canvasコンストラクターにあります。

問題の真実は、特定の実装の内部には何も必要としないということですself。メソッドを他のオブジェクトやコールバックに渡すことを計画している場合を除いてself、メソッドの内部に存在する関数の記述に取り掛かるまでは、そこでは必要ありません。それでも、その特定のインスタンスのパブリックプロパティ/メソッドにアクセスすることはすべて役に立ちますが、アクセスなどselfには役立ちません。eventsi

行うのが良くないことは言うまでもありません。オブジェクト構築のことよりも、オブジェクト構成のことをしているときの方が便利です(そして、しばしば完全に必要になります)。

2番目のことはもっと問題でした。 __proto__FireFox / Chromeについて話している場合は、十分にサポートされている可能性がありますが、幅広いブラウザをサポートする必要がある場合は、追加するのではなく、そのようにすることで生活をはるかに困難にします。ConstructorFN.prototype物体。

于 2012-09-19T23:40:31.847 に答える