0

私はプロトタイプを持っておりNode、いくつかのオブジェクトを作成しています。

これらのオブジェクトの存続期間中に、またはになる必要がある場合があります。私は現在、「サブクラス」ごとにヘルパーを使用し、両方のヘルパーで共通のインターフェイスを共有することでこれを処理しています。状態パターンのようなものを考えてください。ValueNodePropertyNode

ただし、ヘルパーを使用せずに、既存のオブジェクトを追加機能で実際に拡張することにより、この設計を改善したいと思います。

すなわち:

n = new Node();

...

// n needs to become a ValueNode
// ???

n.methodDefinedForValueNodesOnly();

これはJavaScriptで可能ですか?そして、それは「良い習慣」ですか?

4

2 に答える 2

1

ミックスインに関するこの記事を読んだ後、次のソリューションを使用することになりました (基本的にはミックスインをうまく使用しています)。

Node = function() {};
Node.prototype.one = function() {alert(1)};

asValueNode = (function() {
  function two() {
    alert(2)
  };
  return function() {
    this.two = two;
    return this;
  }
})();

u = new Node();
// u is a usable Node.
// ...

// Make u a ValueNode
asValueNode.call(u);

u.one();
u.two();
于 2012-08-29T16:27:29.160 に答える
0

JavaScript では、プロトタイプの継承を 1 回だけ実行できます。ExtJSEmber.jsなどの豊富なクラス サブシステムを提供するフレームワークを使用できます。別のアプローチとして、目的のオブジェクトのプロパティを繰り返し処理し、ターゲット オブジェクトに適用することもできます。このようなもの:

function Node( desc ) {
    this.desc = desc;
    this.doNodeThing = function() {
        console.log( "noding for " + this.desc );
    }
}

function FooNode( desc ) {
    this.desc = desc;
    this.doFooNodeThing = function() {
        console.log( "foo noding for " + this.desc );
    }
}

function BarNode( desc ) {
    this.desc = desc;
    this.doBarNodeThing = function() {
        console.log( "bar noding for " + this.desc );
    }
}

function inherit( obj, superObj ) {

    for ( var x in superObj ) {
        if ( typeof superObj[x] == "function" ) {
            obj[x] = superObj[x];
        }
    }
}

var n1 = new Node( "tree node" );
n1.doNodeThing();

var n2 = new Node( "folder node" );
n2.doNodeThing();

inherit( n1, new BarNode() );
n1.doBarNodeThing();
//n2.doBarNodeThing();    <= TypeError: n2.doBarNodeThing is not a function

inherit( n1, new FooNode() );
n1.doBarNodeThing();
n1.doFooNodeThing();
//n2.doFooNodeThing();    <= TypeError: n2.doFooNodeThing is not a function

上記のコードは、オブジェクトのプロトタイプではなく、オブジェクト自体に関数を追加します。

jsFiddle: http://jsfiddle.net/davidbuzatto/3cCGC/

于 2012-08-29T16:02:24.833 に答える