为什么用构造函数创建对象在javascript中执行对象的方法?

时间:2016-04-19 04:51:53

标签: javascript object methods constructor object-construction

假设我想要三个Room类型的对象。这三个对象是bedroomlivingroombathroomRoom有两个属性lengthbreadth,还有一个方法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();只将房间对象的属性分配给卧室对象吗?为什么它执行对象方法?

  • 如何在不执行方法的情况下创建对象?

3 个答案:

答案 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属性。