繁体   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