簡體   English   中英

javascript中的原型繼承問題

[英]Prototypal inheritance question in javascript

我理解什么是原型繼承,但我必須對實現感到困惑。 我認為修改函數構造函數的原型會影響該構造函數的所有實例,但事實並非如此。 JS如何從對象查找方法到其原型?

這是一個例子

function A(name){
  this.name = name;
}

a = new A("brad");

A.prototype = {
  talk: function(){
    return "hello " + this.name;
  }
}

a.talk() // doesn't work
b = new A("john");
b.talk() // works

我的印象是a會尋找方法talk()中的A的原型,所以任何修改A的原型,之前或之后, a被實例化將得到體現,但是這似乎並沒有這樣的情況。 有人可以幫我解釋一下嗎?

這是修改替換原型之間的區別。

function A(name){
  this.name = name;
}

a = new A("brad");
// Change, don't replace.
A.prototype.talk = function(){
    return "hello " + this.name;
};

a.talk() // works
b = new A("john");
b.talk() // works

這是正在發生的事情:

// Continued from above
var old_proto = A.prototype;

// Nuke that proto
A.prototype = {
talk: function() {
    return "goodbye " + this.name;
}
};

var c = new A("Al");

a.talk() // hello brad
b.talk() // hello john
c.talk() // goodbye Al

old_proto.say_goodbye = function() {
    return "goodbye " + this.name;
};

a.say_goodbye() // goodbye brad
b.say_goodbye() // goodbye john
c.say_goodbye() // TypeError c.say_goodbye is not a function.

為了支持Sean的好答案:只要你創建對象的實例之前完成它,替換整個原型就沒有錯。 這也有效:

function A(name){
  this.name = name;
}

A.prototype = {
  talk: function(){
    return "hello " + this.name;
  }
}

a = new A("brad");

a.talk() // works

請確保以后不要更換它(除非那是你要做的)。

在您的原始示例中, A在您創建第一個實例時沒有自定義原型,但是在您創建第二個實例時它確實擁有它,因為您在兩者之間創建了原型。

原型鏈是在實例化對象時建立的,因此正如您所演示的那樣,同一“類”的兩個實例可能具有不同的原型。

這可能會導致各種麻煩:

var a = new A("brad");
console.log(a instanceof A) // true

A.prototype = {
  talk: function(){
    return "hello " + this.name;
  }
}

console.log(a instanceof A) // false

a引用的對象不再被視為A的實例,因為instanceof通過檢查A.prototype是否在a的原型鏈中a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM