0

次のスニペットのように、プロトタイプの継承を試しています。

function extend(c, p) {
    function f() { this.constructor = c; }
    f.prototype = p.prototype;
    c.prototype = new f();
}

function Parent() {}
function Child() {}

extend(Child, Parent);

var p = new Parent();
var c = new Child();

// Child.prototype.say = function () { alert("child"); };
Parent.prototype.say = function () { alert("parent"); };

p.say();
c.say();

このスクリプトを実行すると、2 つのアラートparentが表示されます。

ただし、コメント行のコメントを外すと、最初のアラートには が表示されparent、2 番目のアラートには が表示されますchild
ぱっと見、かなり予想外でした。後で設定されるため、Parent.sayオーバーライド されるように思われます。Child.say

私の理解でChild.prototypeは、 は オブジェクトのインスタンス、 のインスタンスであるため、fこのプロトタイプに設定されたすべてのプロパティは、 の特定のインスタンスに直接設定されますf

を呼び出すc.sayと、次のことが起こります。

  1. sayに直接設定されている場合はc、それを呼び出します。インスタンスに直接設定されることはないため、2 に進みます。

  2. のインスタンスであるsayinを探します。ここでも、 のインスタンスに直接設定されたプロパティを探します。行がコメント解除されている場合、がここに見つかり、検索が停止します。Children.prototypeffsay

  3. sayf.prototypeある を探しParent.prototypeます。これは、行がコメントsayされたままの場合に見つかる場所です。

Q: JavaScript がプロパティを検索する方法を正しく理解できましたか? この場合、行のコメントが解除されているときに、子プロパティが親プロパティによってオーバーライドされない理由を説明できます。

4

1 に答える 1