当我遇到原型概念时学习javascript。我成功地为 cat 类添加了新方法,但未能覆盖原始的 talk 方法。
function cat(name) {
this.name = name;
this.talk = function() {
alert( this.name + " : I'm a girl!" )
}
}
cat.prototype.talk = function() {
alert( this.name + " : I'm a dude!" )
}
cat1 = new cat("felix")
cat1.talk()
为什么不警告新文本?
答案 0 :(得分:16)
'function cat'只是一个功能。它的原型是一个空的Object({})。可以调用'new cat'来向新对象添加成员'name'和'talk'。在新的Object下面将是函数原型,它仍然是{}。
var c= new cat('Tiddles');
c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: {}
现在当您写入'cat.prototype.talk'时,您正在向该基础对象添加成员:
c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: { 'talk': function() {...} }
直接在实例'c'上设置的'talk'函数优先于间接在c的构造函数原型上设置的'talk'。
所以你在这里混淆了两种继承方式,'this'赋值方法和'prototype'方法。
将方法编写到原型中的优点是,您不会将复制到每个对象实例中的相同成员的冗余副本;写入实例的优点是它可以解决绑定方法的问题。你选择哪一个取决于你,但不要混淆两者。如果你想去原型路线,只有'name'应写入'this',因为这是唯一一个特定于每个实例的属性。
答案 1 :(得分:7)
开头附加的函数附加到对象(每个实例1个函数)。另一个附加到原型(所有实例共享的1个函数)。
对象级别的成员会覆盖原型级别的成员。