假设我想要三个Room
类型的对象。这三个对象是bedroom
,livingroom
和bathroom
。 Room
有两个属性length
和breadth
,还有一个方法myFunc
。我使用构造函数方法创建三个必需对象:
function Room(len, bred, myFunc) {
this.len = 5;
this.bred = 8;
this.myFunc = alert();
}
var bedroom = new Room();
var livingroom = new Room();
var bathroom = new Room();
问题在于,当我运行此脚本myFunc
时,会执行三次显示警报。我认为,由于new
关键字将函数转换为对象,因此它不能执行该对象的方法 - typeof new Room
返回"object"
。
我的问题是:
如果语句new Room();
将Room()
函数的副本转换为对象,那么这与使用文字符号创建对象是否相等?如果是,那么不应该var bedroom = new Room();
只将房间对象的属性分配给卧室对象吗?为什么它执行对象方法?
如何在不执行方法的情况下创建对象?
答案 0 :(得分:1)
alert
是函数,alert()
执行它。它与如何创建对象无关。
请记住,alert
需要包装,因为它是用JavaScript外来的本机代码编写的。
所以它应该是(带有可点击的例子):
function Room(len, bred, myFunc) {
this.len = 5;
this.bred = 8;
this.myFunc = function(x) {
alert(x)
};
}
var bedroom = new Room();
var livingroom = new Room();
var bathroom = new Room();
bedroom.myFunc('This is the bedroom.');
主要原因是alert
期望this
绑定到window
。意味着以下内容也适用:
this.myFunc = alert.bind(window);
function Room(len, bred, myFunc) {
this.len = 5;
this.bred = 8;
this.myFunc = alert.bind(window);
}
var bedroom = new Room();
var livingroom = new Room();
var bathroom = new Room();
bedroom.myFunc('This is the bedroom.');
答案 1 :(得分:0)
您正在分配期间执行该功能,这就是您看到三次执行该代码的原因。 只需将您的作业替换为函数名称本身:
function Room(len, bred, myFunc) {
this.len = 5;
this.bred = 8;
this.myFunc = alert;
}
var bedroom = new Room();
var livingroom = new Room();
var bathroom = new Room();
答案 2 :(得分:0)
不要使用带警报的括号。括号导致警报被执行。如果省略括号,则会将函数警报分配给myFunc属性。