JavaScript原型继承不起作用

时间:2013-01-21 11:17:47

标签: javascript prototypal-inheritance

我是JS的初学者,并且一直试图让以下代码工作,但它没有给我预期的结果:

cat = function(name) {
    this.name = name;
    this.talk = function() {
        alert("Cat "+name+" says meow.");
    }
}
cat1 = new cat("George");
cat1.talk();

cat.prototype.changeName = function(name) {
    this.name = name;
}
cat2 = new cat("Felix");
cat2.changeName("Bill");
cat2.talk();

从我读到的关于JS的内容,我应该得到第二个警告"Bill says meow"。但看起来该属性没有设置,我仍然得到"Felix says meow."

有人可以指出错误吗?这将非常有帮助。提前谢谢。

3 个答案:

答案 0 :(得分:2)

这不是继承问题,而是访问正确变量的问题。看看你的构造函数:

cat = function(name) {
    this.name = name;
    this.talk = function() {
        alert("Cat "+name+" says meow.");
    }
}

具体来说是alert("Cat "+name+" says meow.");name始终引用您传递给构造函数的参数。您应该访问this.name,因为您的changeName方法会将this.name设置为新值。

没有理由在构造函数中定义此方法,并将其添加到原型中:

var Cat = function(name) {
    this.name = name;
}

Cat.prototype.talk = function() {
    alert("Cat " + this.name + " says meow.");
}

答案 1 :(得分:1)

你没有使用继承。我从你的代码中看不到你需要它的位置。

首先:您的“talk”功能需要访问此“name属性”。不是。

Cat = function(name) {
    this.name = name;
    this.talk = function() {
        alert("Cat "+this.name+" says meow."); //needs the to access this' name property
    }
}

下一步:每次创建实例时都不需要重新声明talk方法:

Cat.prototype.talk = function(){
    ...
}

如果你确实需要继承,你可以实现它:

var MainCoon = function(name){
    this.name = name;
}
MainCoon.prototype = new Cat();
MainCoon.prototype.be6ftTall = function(){

}

答案 2 :(得分:1)

参考这个引用函数cat的实例,所以this.name是cat实例中name的值。引用名称(不带此)指的是构造函数后cat的函数名称。我认为阅读本文后你可能会获得更多的洞察力:

https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Inheritance_Revisited

页面底部有一个下一个链接,当你到达有关闭包的部分时,你可能会理解name变量和this.name变量的范围。

JavaScript也不是基于类的语言,而是(根据某些原因很难实现)原型语言:

http://www.lshift.net/blog/2006/07/24/subclassing-in-javascript-part-1

如果您的子类“子类”是父类,或者更好地说:如果您的childFunction使用parentFunction作为其原型,请注意任何chidFunction“实例”共享其父级的惰性副本,如此示例所示:

var parent,child,bill,suzan;
parent=function(){
    this.name="parent";
    this.array=[];
}
child=function(){
}
child.prototype=new parent();
bill=new child();
bill.name="bill";
suzan=new child();
suzan.name="suzan";
suzan.array.push("done in suzan");
console.log(suzan.name);//correct is suzan
console.log(bill.name);//correct is bill
console.log(bill.array);//incorrect, shows ["done in suzan"]

您可以通过将“子”更改为:

来解决此问题
child=function(){
    parent.call(this);
}

但是只有在父类函数体中使用this声明对象属性(不包括函数)时才有效。语法而不是原型。