1

How ECMAScript 5 still does not allow to subclass an arrayに関する kangax のブログを読んでいます。ここで彼は、通常のプロトタイプ構造とは異なるサブクラス化のアプローチを使用しています。

BaseClass.prototype = new Superclass();

彼がしていることはこれです:

function clone(obj) {
  function F() { }
  F.prototype = obj;
  return new F();
}

次に、次のように継承を設定します。

function Child() { }
Child.prototype = clone(Parent.prototype);

誰かが継承のこの 2 つの部分からなるアプローチと、上記の単純な 1 つのライナーのアプローチに比べてどのような利点があるかを説明できますか?

編集:コメントから、Object.create()基本的にメソッドと同じ目的を解決する標準があることを理解してclone()いますが、この実装はどのように機能しclone()ますか?

4

2 に答える 2

0

Object.create またはヘルパー関数を使用して継承のプロトタイプを設定する理由を示すには、次のコードを参照してください。

function Hamster(name){
  if(name ===  undefined){
    throw new Exception("Name cannot be undefined");
  }
  this.name=name;
};

function RussionMini=function(name){
  Hamster.apply(this,arguments);
};
RussionMini.prototype=new Hamster();//throws Error

できますRussionMini.prototpe=new Hamster("dummyvalue");が、オブジェクト (DOM 要素など) を宣言するときに使用できない値を渡す必要がある場合はどうすればよいでしょうか。ダミーを渡すことはできますが、コードがより複雑になり、リファクタリング時に壊れやすくなります。

両方の例は、prototype.constructor を修復しないためthis.constructor、間違った関数を指します (Object.create(Parent.prototype);` を使用した場合にも発生します)。

継承、オーバーライド関数、および構築関数を使用したプロトタイプの詳細については、次を参照してください:プロトタイプの継承 - 作成

于 2013-07-13T13:08:22.453 に答える
0

それは興味深い質問です。あなたが提供しているコード (クローン関数) は、Douglas Crockford によって「プロトタイプ継承」と呼ばれ、彼の Web サイトのこの記事で説明されています。このパターンはポピュラーになり、ECMA script 5 で Object.create() に形式化されましたが、 object create の仕様を見ると、Crockford の関数の仕様とまったく同じです。次のように使用されます。

var Animal = {
    species: "mammal",
    noises: function () {
        console.log("makes noises")
    },
    actions: ["roll back", "jump up"]
}

var Cat = Object.create(Animal);
Cat.name = "blacky"
Cat.miau = function () {
    console.log("miau miau");
}

サブクラスの新しいプロパティを定義するときに、サブクラスとスーパークラスの違いを指定するだけなので、Crockford はこの差分継承とも呼んでいます。Cat には独自のプロパティ「name」と独自のメソッド「miau」が追加されました。

これに関する主な問題は、インスタンス間で配列などの参照値を共有していることだと思います。

もしそうなら:

var Cat2 = Object.create(Animal);
Cat2.actions.push("bite Henry");
Cat2.actions
["roll back", "jump up", "bite Henry"]
Cat.actions
["roll back", "jump up", "bite Henry"]

しかし、少なくともインスタンス プリミティブ プロパティは共有されていません。

Cat2.name
undefined
Cat.name
"blacky"
于 2013-07-13T10:20:16.777 に答える