3

クラスを持つ:

function Animal() {
  // do something
}

Animal.prototype.walk = function() {
  alert('I am walking.');
};

および子クラス:

function Lion() {
  // do something
}

のプロトタイプLionを継承したい場合、一般的な方法は次のとおりです。Animal

Lion.prototype = new Animal();

// Set the constructor to Lion, because now it points to Animal
Lion.prototype.constructor = Lion;

これはこれと何らかの点で異なりますか (パフォーマンスとしてではなく結果として)?

$.extend(Lion.prototype, Animal.prototype);

jquery 以外の開発者向け:$.extendすべてのプロトタイプ メソッドと属性を Animal から Lion に 1 つずつコピーします。

私は JavaScript の継承の専門家ではありません。私は通常、すべてが機能するフロントエンド開発に MVC フレームワークを使用しますが、プロトタイプの継承がどのように機能するかについても理解したいと思っています。

ノート! この件に関する記事をたくさん読みました。クラス機能を実装する「プラグイン」がたくさんあることは知っています。これは私が必要とするものではありません。主題に関する記事をリンクするだけでなく、質問に答えてください (それが答えている場合を除く)。

ありがとうございました!

4

5 に答える 5

3

違いがあります。2 つのプロトタイプ間でプロパティをコピーしても、それらは互いに「接続」されません。つまり、次のようになります。

$.extend(Lion.prototype, Animal.prototype);

// add one more method to the prototype
Animal.prototype.test = function() {
  alert('test');
};

var x = new Lion();
x.test(); // TypeError: Object <Lion> has no method 'test'

ここに示さnew Animal()れているように、 のプロトタイプとしてを使用する場合、これはありません。Lion

于 2013-05-28T06:48:42.140 に答える
3

最近、 Why Prototypal Inheritance Mattersを説明する記事を書きました。少し長いですが、読む価値があります。

あなたの質問に直接答えるために、はいは次の理由Lion.prototype = new Animalとは異なります。$.extend(Lion.prototype, Animal.prototype)

  1. 最初のケースでは、delegationを使用しています。
  2. 2 番目のケースでは、連結を使用しています。

リンクさせていただいた投稿では、真のプロトタイプ継承 (つまり、プロトタイプ パターンを使用したプロトタイプ継承) について説明しています。

JavaScript で真のプロトタイプ継承を使用した場合、プログラムは次のようになります。

var animal = {
    create: function () {
        return this.extend();
    },
    walk: function () {
        alert("I am walking.");
    }
};

var lion = animal.extend({
    create: function () {
        return animal.create.call(this);
    }
});

ここでのextend関数は、私があなたにリンクした投稿のものです。

これを、プロトタイプの継承にコンストラクター パターンを使用するコードと比較してください。

これは、実際のプロトタイプの継承を示すフィドルです: http://jsfiddle.net/6x4BU/

于 2013-05-28T06:51:09.710 に答える
1

いいえ、それらは同じではありません。

最初の例では、Lion プロトタイプがAnimalのインスタンスになります。そのインスタンスは Animal プロトタイプから継承し、そのプロトタイプにリンクします。Animal プロトタイプが変更されると、インスタンスが影響を受けます。

2 番目の例は、Animal プロトタイプからプロパティをコピーするだけで、Lionは実際の Animal プロトタイプ自体にはリンクされません。

于 2013-05-28T06:51:24.650 に答える
0

これは、純粋な JavaScript での基本的なプロトタイプの継承です。

// base class declaration
function Animal (arg) {
    this.arg = arg;
}

// just a method in the Animal class, it can be whatever you want
Animal.prototype.roar = function () {
    alert(this.arg);
};

// object that inherits the base class
function Lion (arg) {
    // the call to the super constructor
    Animal.call(this, arg);
}

// the prototypical inheritance
Lion.prototype = Object.create(Animal.prototype);
// the constructor needs to be set so that it does not show as the base constructor
// otherwise the constructor for all instances of Lion will show as Animal
Lion.prototype.constructor = Lion;

var symba = new Lion('the lion is roaring');

symba.roar();
于 2013-11-20T15:32:53.063 に答える