为什么用构造函数创建对象会执行对象's方法

Why does creating objects with constructor execute object's method in javascript?

本文关键字:方法 对象 执行 构造函数 创建对象 为什么      更新时间:2023-09-26

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

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

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属性分配一个函数警报。