【发布时间】:2016-08-11 01:38:32
【问题描述】:
假设我想要三个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 对象 的属性分配给卧室对象吗?为什么会执行objects方法?如何在不执行方法的情况下创建对象?
【问题讨论】:
-
我很快注意到,即使用文字符号创建对象也会执行它的方法。
-
您不了解
alert()和alert之间的区别。这与创建对象无关。 -
@JLRishe 我认为函数的名称后必须有括号。 javascript 在看到
alert时会做什么?它会用它的定义替换alert吗? -
alert是一个函数,function(x) { alert(x); }也是一个函数。当你在函数后面加上括号时,函数会被执行:alert("foo")或(function(x) { alert(x); })("foo")。 -
它与 C 不太一样,因为 JavaScript 是面向对象的,而 C 不是(而且它以一种“奇怪”的方式面向对象,与 C++ 不同, 例如)。变量
this至关重要;事实上,函数和方法之间的区别非常脆弱。alert期望像方法一样被调用(window.alert;之所以可以调用为alert是因为没有局部变量alert,而window是默认接收者)。你绝对应该完成关于 JS 中的对象的章节......
标签: javascript object methods constructor object-construction