1

JavaScriptの継承とプロトタイプにいくつか問題があります。私が行ったすべての調査では、stackoverflow / googleでクラスのプロトタイプを使用するようになりましたが、それは避けたいポイントです。私は今JavaScriptがそのように考えられていませんが、それは可能だと確信しています。

私には2つのクラスがあります(またはそれ以上かもしれません)。1つはベースであり、それがすべての母になります。基本的な属性とメソッド(基本的なOOなど)をすべて備えている必要があります。私のオブジェクトはジオメトリ用です。


    function EnvObject(){
      this.position = {x: 0, y: 0};
      this.velocity = {x: 0, y: 0};
      this.mass = 0; // kg
      this.restitution = 0; // Restitution
      this.A = 0;
      this.Cd = 0; // Drag force

      function init(_x, _y, _mass, _restitution)
      {
        blabla
      };
    };

    function oCircle()
    {
     function foo(){}
     function bar(){}
    }
    function oSquare()
    {
     function foo(){}
     function bar(){}
    }

メインクラスは、正方形や円など、クラスのすべての情報を提供します...プロトタイプで拡張すると、大きな問題と素晴らしいことにつながります。メソッドは十分に共有されます(それはクールです)が、私の属性も共有されるので、 Squareクラスで変更すると、Circleでも属性が変更されます(これは悪いことです)

主な解決策は、属性のインターフェイスを提供せず、Square / Circleクラスにのみ配置することですが、あまりクリーンではありません(つまり、同じ属性を2回以上記述します)。

私の主な目標は、2つ以上の他のクラスで新しいクラスを作成することです。それらは何も共有せず、あるいはほんの少しのメソッドを共有するだけですか?そして最終的にはクリーンなコードを書きますか?:)

だから私はたくさんのスクリプトを試しました...それらはすべてそのテクニックを使用しています。あるいは、私は間違っているかもしれませんが、それはおそらく本当です。

また、クラスがJSに存在しないことも知っています。これは、単なる大きな関数です。このようなオブジェクトを書く方がいいですか?関数の使用は私の意見では少し混乱しているので、私はそれをとても好きになる傾向があります。たぶん、継承はこの方法ではるかに簡単ですか?

var envObject = {
    position: {x, y}
}
var oCircle = {
    foo: function(){}
}
4

4 に答える 4

1

プロトタイプオブジェクトの新しいインスタンスを使用します。

function oCircle() {
    function Circle() {
        this.foo = function(){};
    }
    Circle.prototype = new EnvObject();
    return new Circle();
};

これで、を呼び出すたびにnew oCircle()、EnvObjectの新しいインスタンスが使用されます。これは、クラスベースの継承に期待することです。

于 2013-01-31T16:33:12.657 に答える
1

ネストされたオブジェクトposition、 )に問題がある可能性がありますvelocity。個別のインスタンスごとに個別にサブオブジェクトを作成する必要があります。

また、クラスがJSに存在しないことも知っています。これは、単なる大きな関数です。このようなオブジェクトを書く方がいいですか?

いいえ、「より良い」ではなく、ただ違うだけです。newで呼び出されてプロパティを設定するコンストラクター関数を使用する代わりに、thisプレーンオブジェクトを返す関数を使用できます-混乱が少なくなります。

たぶん、継承はこの方法ではるかに簡単ですか?

JavaScriptが使用する典型的な継承ではありません。また、JavaScriptで「クラス」がどのように機能するかについてこの回答を確認することをお勧めします。

于 2013-01-31T16:35:21.893 に答える
0

プロトタイプチェーンとコンストラクタースティーリングの組み合わせを適用しようとしましたか?

    function SuperType(){
        this.prop1 = // some value
        this.prop2 = // some other value
    }

    SuperType.prototype.function1 = function(){

    };

    function SubTypeA(){
        SuperType.call(this); // add inherited properties to this instance

        this.subTypeProperty1 = ...
    }

    SubTypeA.prototype = new SuperType();

    SubTypeA.prototype.subTypeFunction1 = function(){

    }

各サブタイプには、独自の継承されたプロパティがあります。

于 2013-01-31T16:31:50.947 に答える
0

最善のアプローチ...(私は見た)

これは良い出発点です-コンストラクターの盗難とプロトタイプの継承 の組み合わせを使用します(上記の#ppolianiで示されています)

function SuperType() {
    this.super = 'type';
}
SuperType.prototype = { m: function () { } };

function C() {
    SuperType.call(this);
    this.key = 'value';
};
C.prototype = (new (function () {
    $.extend(this, new SuperType());
    this.some = 'thing';
})());

var c = new C();
console.log(c);

ただし、これにはある程度の調整が必要になる可能性があります。たとえば、C.prototypeオブジェクト(使用newできるように使用するthis-これは良い)が拡張thisされnew SuperType()、メソッドが追加されますが、良くthisありませ C.prototypeん。また、非ネイティブ$.extend関数を使用します-良くありません。

もちろん、継承を多用することは非常に望ましくない方法論になる可能性があります。Complex-Deep-Inheritance-Hierarchiesは、多くの場合、クラスアーキテクチャに極端なエントロピーをもたらします。階層が複雑な場合、深いアーキテクチャはメンテナンス、移植性、および適応性の悪夢になります。この場合は、デコレータパターンの実装を開始してください。

これは、継承チェーンを操作するためのより優れたツールを読者に提供するための、ここでの実証的な答えです。

お役に立てれば。

于 2014-11-07T22:43:10.933 に答える