【问题标题】:Why does creating objects with constructor execute object's method in javascript?为什么用构造函数创建对象在javascript中执行对象的方法?
【发布时间】:2016-08-11 01:38:32
【问题描述】:

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


【解决方案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.');

【讨论】:

  • 但是我如何用bedroom.myFunc 调用alert()?它不会弹出警报消息。
  • bedroom.myFunc('this is the bedroom')
  • 或者你可以试试这个'this.myFunc = function(x){alert(x)};'
  • 不,因为它在函数定义中。 function Room(...) {... alert("foo"); } 在您致电 Room()new Room() 之前不会发出警报;同样,this.myFunc = function(x) { alert(x) } 在您执行 this.myFunc("foo") 之前不会发出警报。
  • 没有。您可以将foo 分配给该对象属性。 obj.property = foo; Here's 小提琴手。
【解决方案2】:

您正在分配期间执行该函数,这就是为什么您会看到该代码执行了三个执行。 只需将您的分配替换为函数名称本身:

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();

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-07-01
      • 1970-01-01
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 1970-01-01
      • 2021-06-30
      • 2023-03-15
      相关资源
      最近更新 更多