3

JavaScriptオブジェクトの継承を学ぼうとしています。シェリーパワーズのJavaScriptクックブックを参照しています。

サブクラスでは、そのプロパティを使用するためにsuperclass.apply(this、arguments)を呼び出す必要があります。そして本によると、私はsubclass.prototype = new superclass();のようなものも書く必要があります。

ただし、subclass.prototype = new superclass();を使用しなくても機能することに注意しました。声明。以下は私のコードです。subclass.prototype = new superclass();の目的は何ですか。

var Book = function (newTitle, newAuthor) {
    var title;
    var author;
    title = newTitle;
    author = newAuthor;
    this.getTitle = function () {
        return title;
    }
    this.getAuthor = function () {
        return author;
    }
};
var TechBook = function (newTitle, newAuthor, newPublisher) {
    var publisher = newPublisher;
    this.getPublisher = function () {
        return publisher;
    }
    Book.apply(this, arguments);
    this.getAllProperties = function () {
        return this.getTitle() + ", " + this.getAuthor() + ", " + this.getPublisher();
    }
}
//TechBook.prototype = new Book(); // Even when commented, 
var b1 = new TechBook("C Pro", "Alice", "ABC Publishing");
var b2 = new TechBook("D Pro", "Bob", "DEF Publishing");
alert(b1.getAllProperties());
alert(b2.getAllProperties());
alert(b1.getTitle());
alert(b2.getTitle());
4

2 に答える 2

4

Bookコンストラクターの関数をに追加しているため、これは機能しthisます。したがって、をBook介して渡すオブジェクトが何であれapply、メソッドはこのオブジェクトに設定されます。

しかし、そのプロトタイプを通して持っているかもしれないTechBookメソッドを持っていません。Book

たとえば、次のようなものがある場合:

Book.prototype.getTitle = function()...

のプロトタイプを正しく設定TechBookしない限り、この機能はありません。TechBook


コンストラクターで関数を設定することにより、作成するインスタンスごとに各メソッドの新しいインスタンスを作成します。これを回避するためにプロトタイプが使用されるため、複数のインスタンスがコードを共有できます。

于 2011-05-25T14:38:14.343 に答える
1

JavaScriptオブジェクトの継承を学ぼうとしています。シェリーパワーズのJavaScriptクックブックを参照しています。

サブクラスでは、そのプロパティを使用するためにsuperclass.apply(this、arguments)を呼び出す必要があります。そして本によると、私はsubclass.prototype = new superclass();のようなものも書く必要があります。

私はその本を持っていません。Javascriptにはクラスがありません。当面はそれらを忘れて、プロトタイプの継承がどのように機能するかに集中するのが最善です。クラスベースの継承をエミュレートできますが、通常は必要ないか、望ましくありません。

コードはプロトタイプの継承を使用せず、コンストラクターによって作成された各インスタンスにプロパティを作成します。

Book内から呼び出すTechBookと、コンストラクターとしては呼び出されず、関数として呼び出され、thisからオブジェクトが渡されるTechBookため、プロパティはそのオブジェクトに直接追加されます。

によって返されるオブジェクトはTechBook.prototypenew TechBookから継承しますが、プロパティを設定していません。

コードパターンは、コンストラクターを使用して、クロージャーを使用してプライベートメンバーと特権メンバーをエミュレートしているようです。モジュールパターンは、そのためにより一般的に使用されます。

最後に、BookTechBookは、式ではなく関数宣言としてより適切に記述されます。

于 2011-05-25T14:52:39.817 に答える