次のスニペットのように、プロトタイプの継承を試しています。
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
と、次のことが起こります。
say
に直接設定されている場合はc
、それを呼び出します。インスタンスに直接設定されることはないため、2 に進みます。のインスタンスである
say
inを探します。ここでも、 のインスタンスに直接設定されたプロパティを探します。行がコメント解除されている場合、がここに見つかり、検索が停止します。Children.prototype
f
f
say
say
でf.prototype
ある を探しParent.prototype
ます。これは、行がコメントsay
されたままの場合に見つかる場所です。
Q: JavaScript がプロパティを検索する方法を正しく理解できましたか? この場合、行のコメントが解除されているときに、子プロパティが親プロパティによってオーバーライドされない理由を説明できます。