0

假设我想要三个类型的对象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();只将Room 对象的属性分配给卧室对象吗?为什么它执行对象方法?

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

4

3 回答 3

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.');


编辑:

主要原因是alertexpectsthis是必然的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.');

于 2016-04-19T04:55:38.447 回答
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();
于 2016-04-19T04:56:12.070 回答
0

不要在警告中使用括号。括号导致警报被执行。如果省略括号,则函数警报将分配给您的 myFunc 属性。

于 2016-04-19T04:57:09.777 回答