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

dat*_*.io 7 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()
Run Code Online (Sandbox Code Playgroud)

为什么不提醒新文本?

bob*_*nce 16

'功能猫'只是一个功能.它的原型是一个空的Object({}).可以调用'new cat'来向新对象添加成员'name'和'talk'.在新的Object下面将是函数原型,它仍然是{}.

var c= new cat('Tiddles');

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: {}
Run Code Online (Sandbox Code Playgroud)

现在,当您写入'cat.prototype.talk'时,您正在向该基础对象添加成员:

c ownProperties: { 'name': 'Tiddles', 'talk': function() {...} }
c inherited: { 'talk': function() {...} }
Run Code Online (Sandbox Code Playgroud)

直接在实例'c'上设置的'talk'函数优先于间接在c的构造函数原型上的'talk'设置.

所以你在这里混淆了两种继承风格,'this'赋值方法和'prototype'方法.

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


Mah*_*eTo 7

在开头附加的函数附加到对象(每个实例1个函数).另一个附加到原型(所有实例共享的1个函数).

对象级别的成员将覆盖原型级别的成员.