0

それに入ることができます。Javascript で動作する「慣性カメラ」を作成しました。Javascript の経験は豊富ですが、JS でのプロトタイピングの経験はありません。初期関数コンストラクターを使用して、次のようにカメラを再構築しようとしています。

    function Inertia(subject, clickable) {
        this.subject = document.getElementById(subject);
        this.clickable = document.getElementById(clickable);
    }

そしてプロトタイプ:

    Inertia.prototype = {
        subject : document.getElementById(''),
        clickable : document.getElementById(''),
        camera : { angleX : 85, angleY : 0, angleZ : 0, translateX : 0, translateY : -100, depth : 0, flag : 1 },
        mouse  : { x : 0, y : 0 },
        friction : 1,
        inertia : true,

        mouseEvents : {
            mouseDown   :   function( e ) {
                                var IS = this; // This will not work because I am two levels away from "this" being my object.

                                // cancel existing animation
                                clearTimeout((window).animation);

                                (IS).mouse.x = e.clientX;
                                (IS).mouse.y = e.clientY;
                                (IS).camera.flag = 0;

                                // begin logging history to animate from as a new history stack
                                (IS).tools.pushHistory('reset');
                            },

... 続き ...

私の問題は、プロトタイプ オブジェクト内で、mouse.xやなどのルート レベルの要素にアクセスできないことmouse.yです。このようなプロトタイプを作成するときに、「慣性」クラスのこの特定のインスタンスのこれらの要素にアクセスするための最良の方法は何ですか? これは完全に間違った考えですか?

この方法でプロトタイプの適切な実装を理解しようとしています。プロトタイピングに関するチュートリアルと記事を調べましたが、このネスティングの問題に対処する例はまだ見たことがありません。それらはすべて、プロトタイプで 1 レベルの深さを使用するため、呼び出しthisは問題ありません。

var ISこの慣性カメラのすべてのインスタンスで、その特定のオブジェクトのみを変更するように、現在のオブジェクトと等しくしようとしています。ただし、私はプロトタイプ内で 2 レベル深いため、thisキーワードは機能しません。のインスタンスが 1 つしかない場合は、変数名と同じようにハードコーディングできますがnew Inertia()、それは明らかに望ましくありません。

4

1 に答える 1

0

プロパティは通常、プロトタイプのコンストラクターおよびメソッド内に配置されます。いくつかの概念が欠けている可能性があると思います。プロパティはインスタンスに固有であるため、プロトタイプ内でプロパティを作成 (および複製) しても意味がありません。これらの変数がプライベートであることを意図している場合、通常の規則では、アンダースコアを前に付けます。

function Inertia( subject, clickable ) {

  this.subject = document.getElementById( subject );
  this.clickable = document.getElementById( clickable );

  // Private vars unique to each instance
  this._camera = { ... };
  this._mouse = { ... };
  this._friction = 1;
  this._inertia = true;

}

Inertia.prototype = {

  mouseDown: function( e ) {
    var self = this;
    // Now you can access and modify the private vars:
    self._mouse.x = e.clientX;
    ...
  }

};
于 2012-12-04T07:19:40.080 に答える