2009-04-15 86 views
7

当我遇到原型的概念时学习JavaScript。我成功地向类别类添加了新方法,但未能覆盖原来的说话方法JavaScript原型函数不覆盖原始函数

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() 

为什么不提示新文本?

回答

16

'功能猫'只是一个功能。它的原型是一个空的对象({})。可以调用'新猫'将成员的名字和谈话添加到新的对象中。在这个新对象下面是函数原型,它仍然是{}。

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”需要优先于在c的构造器原型上间接设置的'说话'。

所以你在这里混合了两种风格的继承,'this'分配方法和'prototype'方法。

向原型写入方法的优点是,不会将相同成员的冗余副本复制到每个对象实例中;写入实例具有解决绑定方法问题的优点。你选择哪一个取决于你,但不要混合这两者。如果你想去原型路线,只有'名字'应该被写入'this',因为这是每个实例特有的唯一属性。

7

附加在开头的函数附加到对象(每个实例1个函数)。另一个连接到原型(1个功能由所有实例共享)。

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