【问题标题】:How to add multiple static variables as object?如何将多个静态变量添加为对象?
【发布时间】:2016-08-13 17:44:00
【问题描述】:

我有一个名为 StalkMe 的 js 函数,我想为该函数的所有实例创建一个静态变量。

工作代码:

function StalkMe() {
    this.start = function() {
        while(true) {
            alert("Stalking "+StalkMe.period+" "+StalkMe.name+".");
        }
    }
}
StalkMe.period = "forever";
StalkMe.name = "John Doe";

我想写但写不出来:

function StalkMe() {
    this.start = function() {
        while(true) {
            alert("Stalking "+StalkMe.period+" "+StalkMe.name+".");
        }
    }
}
StalkMe = {
    period: "forever",
    name: "John Doe"
}

为什么第二种方法不起作用?

为什么我不能写alert("Stalking "+this.period+" "+this.name+".");

【问题讨论】:

  • 在 javascript 中命名变量和函数的名称总是很糟糕。

标签: javascript function object constructor


【解决方案1】:

因为使用第二种方法,您将覆盖基础对象。你先说 StalkMe 是一个函数,然后说“哦,不,StalkMe 是一个文字对象。”

你正在重新调整它。

【讨论】:

  • 有没有一种方法可以将对象与函数合并,而无需逐个添加每个变量?由于StalkMe.prototype = "{*functions here*}" 合并,但那是因为我使用了“原型”:/
  • 您可以按照创建start的方式添加属性
  • 否则用关键字“merge Javascript objects”看看你喜欢的搜索引擎
  • 但是将它们添加为this.something 像 start 这样的函数使它们成为非静态的,并在每次创建新的 StalkMe 对象时添加到内存中:/
  • 我考虑过使用 jQuery $.extend() 但这是针对 2 个对象而不是方法和对象:/
【解决方案2】:
StalkMe = {
  period: "forever",
  name: "John Doe"
}

在这里,您将 StalkMe 重新分配给一个只有 2 个名为 period 的键的对象,没有其他名称。 StalkMe 不是对象,所以你可以覆盖它,它是一个构造函数,不是吗?

【讨论】:

    【解决方案3】:

    正如其他人所说,您正在将 StalkMe 对象重新分配给对象文字。

    一般情况下,您希望像这样在构造函数中添加属性并将方法添加到原型中:

    function StalkMe() {
      this.period = "forever";
      this.name = "John Doe";
    }
    
    StalkMe.prototype.start = function() {
      console.log("Stalking "+this.period+" "+this.name+".");
    };
    
    var stalker = new StalkMe();
    stalker.start();
    

    请注意,它也可以在函数中使用 this 来访问对象属性 - 正如您所要求的那样。

    【讨论】:

    • 可悲的是,在函数本身中添加句点和名称会使它们成为非静态的,从而导致它们被复制到每个 StalkMe 实例上的内存中,而不仅仅是一次......
    【解决方案4】:

    StackMe 是一个函数 n 周期 n 名称是它的对象。 当您使用 StackMe.period = "forever" 和 StackMe.name = "John Doe" 时,这意味着您正在为函数的对象分配一个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多