的问题是,你的新的Person实例被覆盖的构造。
当你在一个范围之外定义一个函数时,你实际上将它附加到窗口对象(“全局”范围)。这意味着您的function Person
被分配到window.Person
。
里面点击事件你window.Person = new Person(clicked);
重新分配window.Person
您可以通过简单地重命名的click
回调创建了window.Person
变量使你的榜样工作。然而,更合适的方法是使用closures。这将保持窗口范围更清洁并解决您的问题。
此外,当谈到命名变量和构造,下面的指南通常用于:
- 构造函数名称应该以大写字母开头(例如
function Person
)
- 普通变量应该有一个开始小写字母(例如
var person
)
这样可以避免在编写诸如var person = new Person()
之类的东西时出现任何混淆。
最终的结果看起来是这样的:
function Person(name){
this.name = name;
this.alert = function(){
alert("hello " + this.name);
};
}
function Area (location, name){
this.name = name;
this.location = location;
this.alert = function(){
alert("hello " + this.name + " you live in " + this.location);
};
}
$(document).ready(function(){
var person;
$(".button").click(function(){
var clicked = $(this).text();
person = new Person(clicked);
person.alert();
});
$(".button2").click(function(){
var location = $(this).text();
var name = person.name;
var area = new Area(location, name);
area.alert();
});
});
如果您需要访问click
功能之外area
变量,你当然也可以直接移动var area
声明var person
下。
'窗口。Person = new Person(clicked);'因为你做的特别糟糕,因为你正在用它创建的实例覆盖'Person'构造函数。你应该使用'person = new Person(...)'来区分这两者。 – Bergi 2014-10-08 10:24:31
啊!从来没有注意到,愚蠢的错误,这是有道理的感谢。 – ctaz 2014-10-08 10:43:40