1

ここでは、javascriptでの継承のいくつかの概念を理解しようとしています。personクラスを作成し、Customerクラスで継承しようとしています。

        var Person = function(name) {
            this.name = name;
        };

        Person.prototype.getName = function() {
            return this.name;
        };

        Person.prototype.sayMyName = function() {
            alert('Hello, my name is ' + this.getName());
        };


        var Customer = function(name) {
            this.name = name;
        };

        Customer.prototype = new Person();


        var myCustomer = new Customer('Dream Inc.');
        myCustomer.sayMyName();

新しいオブジェクトが作成されるたびに、javascriptエンジンは基本的にプロトタイプのコンストラクターを呼び出します。ここで私はいくつかのことを理解しようとしています:

CustomerプロトタイプがPersonオブジェクトを参照している場合、新しいCustomerオブジェクトの作成には、Customerプロパティ/メソッドではなくPersonプロパティ/メソッドのみを含める必要があります。Customerプロパティを新しいCustomerオブジェクト(myCustomer)にアタッチするにはどうすればよいですか?

ここにJavaScriptの概念が欠けていますか?

4

4 に答える 4

1

ここでは、javascriptでの継承のいくつかの概念を理解しようとしています。personクラスを作成し、Customerクラスで継承しようとしています。

さて、あなたは確かにすぐに道に迷いました。プロトタイプ継承にはクラスはありません。
それが要点です!:-)


構文の使用は.prototypenew Function()プロトタイプの継承を活用するための明確な方法ではありません。

代わりに使用Object.createnewすることを検討してください-この方法では、どのオブジェクトがどのプロトタイプであるかを直接言うことができます。これはより簡単で、この方法でプロトタイプのアイデアをより早く理解できる可能性があります。

また、より長いプロトタイプチェーンが必要な場合は、この方法の方が確実に使いやすくなります。

于 2012-11-14T12:36:39.810 に答える
1

とを定義Personしてから、のプロトタイプをインスタンスにCustomer設定します。したがって、チェーンは次のようになります。CustomerPerson

myCustomer              (a Customer instance)
  Customer prototype    (a Person instance)
    Person prototype    (a plain object)

確かに、それはそのチェーンにのプロトタイプを持っているのでmyCustomerCustomerインスタンスです。直接インスタンスCustomerと同じではありません。後者は、チェーンにのプロトタイプPersonがありません。Customer

于 2012-11-14T12:47:55.470 に答える
0

CustomerプロトタイプがPersonオブジェクトなどを参照している場合、新しいCustomerオブジェクトには、Customerプロパティ/メソッドではなくPersonプロパティ/メソッドのみを含める必要があります。

はい。新しく作成されたオブジェクトは、のインスタンスCustomerから継承します。そのプロトタイプオブジェクトにプロパティを追加したり、コンストラクターでインスタンスにプロパティを作成したりしていないため、顧客には個人のプロパティのみが含まれます。PersonCustomer.prototypeCustomer

Customerプロパティはどのようにして新しいCustomerオブジェクト(myCustomer)にアタッチされますか?

コンストラクター関数でそれを行います:

function Customer (){
    this.customer_property = someValue;
}

このコードは、を介してインスタンスが作成されるたびに実行されますnew。それが必要ない場合は、Customer.prototypeオブジェクトにメソッドなどを追加するだけです。

ここで「new」キーワードを使用しない理由は何ですか?もご覧ください。-プロトタイプオブジェクトのPersonをインスタンス化するべきではありません-なぜすべての顧客がその名前などを継承する必要があるのですか?使用する

function Customer(name) {
    Person.call(this, name); // apply Person constructor on this instance
                             // for creating own properties (and privileged methodes)
    // custom Customer code
}
Customer.prototype = Object.create(Person.prototype);
Customer.prototype.someMethod = … // Customer-specific prototype things
于 2012-11-14T12:39:17.017 に答える
0

「javascriptエンジンは基本的にプロトタイプのコンストラクターを呼び出す」と言うのが混乱だと思います。Customerの新しいインスタンスの場合、Javascriptは新しいオブジェクトを作成し、プロトタイプを指定したPersonオブジェクトに設定してから、Customerコンストラクター関数を呼び出してオブジェクトをカスタマイズします(これはJSの「クラス」の錯覚です)。プロトタイプコンストラクター関数の再呼び出しはありません。したがって、Customerのフィールド/メソッドは、Customerコンストラクターで設定されます。

顧客オブジェクトに構築後に参照されるメソッド/フィールドがある場合、JavaScriptエンジンは、コンストラクターを介して(またはコンストラクター呼び出しの下流でオブジェクトを操作するコードで)設定されたフィールド/メソッドでそれを見つけようとします。できない場合は、アタッチされているプロトタイプオブジェクトを調べて、メソッド/フィールドを見つけます。このようにして、利用可能な顧客フィールド/メソッドと「スーパークラス」フィールド/メソッドの両方が利用可能になります。

于 2012-11-14T13:06:02.380 に答える