为什么用构造函数创建对象会执行对象's方法
Why does creating objects with constructor execute object's method in javascript?
假设我想要三个类型为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();
不应该只将Room对象的属性分配给卧室对象吗?为什么它执行对象方法?如何在不执行对象方法的情况下创建对象?
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.');
您在赋值期间执行函数,这就是为什么您看到该代码执行了三次。只需将您的分配替换为函数名称本身:
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();
不要将括号与alert一起使用。括号使警报得以执行。如果省略方括号,则会为myFunc属性分配一个函数警报。
相关文章:
- 序列化数据属性中对象的最可靠方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 如何从对象的原型方法访问JavaScript对象属性
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- 设置嵌套对象属性的更好方法
- JQuery示例不起作用-“;对象没有't支持属性或方法'按钮'&”;
- 对象不支持属性或方法“自动完成”
- call()和apply()实际上是用来欺骗方法处理类似数组的对象的
- 对象文字方法上的Javascript绑定不起作用
- Meteor应用程序无法运行-对象#<编译器>没有方法'主机'
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- Underscore.js某些对象的所有方法的总和
- 对象#<XMLHttpRequest>没有方法'完成'
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- 丢失对象“;这个“;方法中的上下文
- 如何在ajax中调用javascript对象的方法
- 为什么页面方法对象未定义
- 如何使用在另一个文件中定义的JavaScript方法/对象
- 如何告诉JsHint忽略“未解析的函数或方法”?对象上的警告
- 使用jinja/javascript动态创建方法/对象