我是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."
有人可以指出错误吗?这将非常有帮助。提前谢谢。
答案 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声明对象属性(不包括函数)时才有效。语法而不是原型。