JavaScript原型函数不覆盖原始函数

7

在学习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()

为什么这个不弹出新文本的警告?
2个回答

16

‘function cat’是一个函数。它的原型是一个空对象({})。可以调用‘new cat’来为新对象添加成员‘name’和‘talk’。在这个新对象下面将会有函数原型,它仍然是 {}。

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’,因为那是每个实例特定的唯一属性。


7

在开始时附加的函数附加到对象上(每个实例一个函数)。另一个函数附加到原型上(所有实例共享一个函数)。

对象级别的成员会覆盖原型级别的成员。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接