1

我是 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."

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

4

3 回答 3

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.");
}
于 2013-01-21T11:21:39.433 回答
1

你没有使用继承。我看不出你从代码中需要它的地方。

首先:您的“谈话”功能需要访问此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(){

}
于 2013-01-21T11:21:58.823 回答
1

引用 this 指的是函数 cat 的实例,因此 this.name 是 cat 实例中 name 的值。引用name(不带this)是指构造函数后面的cat函数名。我想你读完这篇文章后可能会有更多的见解:

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

页面底部有一个 next 链接,当您进入关于闭包的部分时,您可能会了解 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 在父函数体中声明对象属性(不包括函数)时才有效。语法而不是原型。

于 2013-01-21T11:34:08.943 回答