1

私は JavaScript を学び始めました。何が起こっているのかよくわからないまま何年も JavaScript を使っていたので、それについて何かをする時が来たと判断しました。さらに、JavaScript を使用してアプリケーションのスクリプトを作成できるプロジェクトに取り組んでいます。

それで、やだやだはもう十分です。私の問題はプロトタイプの継承に関連しています。今ではそれがどのように機能するかはわかっていると思いますが、問題があるかもしれません。基本的なアイデアは、すべてのオブジェクト (まあ、すべてのオブジェクトではありません ;-)) にはプロトタイプがあり、実際のオブジェクトがプロトタイプチェーンの最後に到達するまですべてのリクエストを処理できない場合は、すべてのリクエストが委任されます (オブジェクトもプロトタイプを持つことができますよね?)。

私のアプリケーションでは、大規模なフィルタリングが発生する予定であり、ユーザー (あまり技術的ではないため、できるだけ簡単にする必要があります) に、追加の呼び出しごとに結果セットを絞り込む単純なフィルター コマンドをチェーンする方法を提供したいと考えています。どういう意味ですか?スムーズ。このような:

zoo.getAnimals().getAnimalsWithFurColor("red").getMammals()

zooは常にスコープ内にあり、動物園の動物と追加のプロパティを含むオブジェクトです。Containerしたがって、この例のすべてのメソッド呼び出しで返されるオブジェクトを次のようにします (これを呼び出します)。

 {
   data: [harryTheElephant, sallyThePenguin, timTheWoodpecker],
   someFilterMethod: function() {
        return new Container(data.filter(function(animal) {
            return animal.someProperty == someValue;
        });
   }
 }

ここまでは順調ですね。しかし、Zoo も入れ物にしたいのです。これが私の本当の質問の出番です。動物園は動物の開始セットを取得するために非常に高価なことをしなければならないので、それらを遅延ロードしたいと思います。動物園がgetAnimals() リクエストを受け取ると、データが取得されます。

私のアイデアは、Zoo のプロトタイプを、Zoo からデータを取得するコンテナに設定することでした。getAnimals()しかし、プロトタイプ (コンテナー) から動物園のメソッドにアクセスする方法が見つかりません。で試してみましたthisが、方法が見つかりません。

私がやりたいことをするコードを書く方法はありますか? 私はブラウザ環境にいないことに注意してください。アプリケーションに JavaScript (1.7) を埋め込みます。

ありがとう!

4

2 に答える 2

1

オブジェクトが (プロトタイプとして) 継承するもののプロパティにアクセスすることはあまり意味がありません。たとえば、にメソッドCatがある場合、 がを参照meow()するのは奇妙です。同様に、 がから派生したものである場合、がを参照するのは奇妙です。Mammalmeow()ContainergetAnimals()ZooContainer

遅延読み込みを実現するための私の提案は、配列を直接渡すのではなく、配列を返すアクセサー関数をコンストラクターに渡すことです。Containerこれは次のようになります。

function Container(getAnimals) {
    this.someFilterMethod = function () {
        return new Container(function () {
            return getAnimals().filter(function (animal) {
                 return animal.someProperty === someValue;
            });
        });
    };

    this.get = getAnimals;
}

function makeZoo(animals) {
    var zoo = Object.create(new Container(function () { return animals; }));
    zoo.customZooMethod = function () { /* ... */ };

    return zoo;
}

var aZoo = makeZoo([harryTheElephant, sallyThePenguin, timTheWoodpecker]);
var filteredAnimals = aZoo.someFilterMethod().get();
于 2011-08-22T13:38:31.183 に答える
0

オブジェクトは、パブリック プロトタイプではなく、内部プロトタイプから継承します。

連鎖を実装するには、各メソッドがインスタンスを返すようにするだけです。

例えば

function Foo(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
} 

Foo.prototype.sayFirstName = function() {
  alert(this.firstName);
  return this;
}

Foo.prototype.sayLastName = function() {
  alert(this.lastName);
  return this;
}

var foo = new Foo('Foo', 'Bar');

foo.sayFirstName().sayLastName();

ただし、デバッグが困難になるため、連鎖はお勧めできません。一連のコマンドを 1 つのステートメントまたは式で連結して失敗した場合、どのコマンドが失敗したかをどのように見つけますか?

編集

次のようなことをしたいかもしれません:

// Container constructor
function Container(dataArray) {
  this.data = dataArray;
}

// Filter data and return new container
Container.prototype.getAnimalsWithFurColor = function(color) {
  var filteredArray = [];

  for (var i=0, iLen=this.data.length; i<iLen; i++) {

    // Presuming the items (animals?) in data have a getColor methed 
    if (this.data[i].getColor() == color) {
      filteredArray.push(this.data[i]);
    }
  }
  return new Container(filteredArray);
}
于 2011-08-22T13:12:45.710 に答える