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

时间:2009-04-15 13:31:46

标签: javascript prototype

当我遇到原型概念时学习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 个答案:

答案 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个函数)。

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

相关问题