【问题标题】:javascript new does not create new objectjavascript new 不会创建新对象
【发布时间】:2014-11-01 19:35:58
【问题描述】:

我试图从同一个类定义中获取两个对象。但是,它们似乎具有相同的属性。我能做什么?

http://jsfiddle.net/dagod/nuam8dks/2/

myclass = function() {
    this.data.push(Math.random(1000));
};

myclass.prototype.data = [];

a = new myclass();   
b = new myclass();
console.log(a.data);
console.log(b.data); //same as a.data

【问题讨论】:

  • data 是共享的,因为您将它放在原型中。将data 声明为构造函数内的自有属性。另外,使用var 来声明你的变量,并将你的构造函数大写作为约定,所以你不要忘记new。
  • @elclanrs 我如何将其标为自己的财产?

标签: javascript class oop object


【解决方案1】:

我一直在做这件事!

myclass = function() {
    this.data = [];

};

现在您只需执行 myclass.data = 即可访问它

我个人是这样做的:

var MyNameSpace = {
  SomeFunction: function() { 
    Some code
  };
  this.somevariable = somevalue;
};

然后你可以去 myNameSpace.myfunction() 或 myNameSpace.myVar = Value

【讨论】:

  • 这个答案相当混乱。你为什么使用命名空间?为什么将data 更改为somevariable?你为什么没有把Some code 写完?最后的|| {} 有什么意义?
  • 我正在使用命名空间,因为如果他继续他的计划,他将需要从他的应用程序中的许多地方访问他的代码,所以把它放在那里很有意义。这个问题与数据无关,特别是与变量范围有关,至于 || {} 我似乎超出了我的剪切和粘贴范围,或者把它弄混了
  • 即使是大型项目也不总是受益于文件中的命名空间。无论如何,OP 的代码很可能是一个更长的脚本的简化版本(因此我们可以专注于重要的事情),它可能已经包含命名空间。我意识到解释一般原则至少与修复此错误一样重要,但我仍然说重命名 data 令人困惑。无需指出,无论属性的名称如何,都适用相同的原则。指出 OP 可能遗漏的问题有时很好,但您必须澄清这是题外话,而不是答案的一部分。
  • 是的,我接受这一点,也许是因为我最近遇到了完全相同的问题,因为我刚刚从 C# 迁移到 JS,所以我具有阅读字里行间的优势。我会尽快修改我的答案,以更好地反映答案背后的思考过程。
  • 从我的角度来看,没有任何借口不给这样的东西命名空间,从编程的角度来看,我为什么要使用“窗口”。因为它不是窗口“类”的一部分,所以它没有加入该命名空间的地方。
【解决方案2】:

查看来自 elclanrs 的评论。

var Myclass = function() {
    this.data = [];
    this.data.push(Math.random(1000));
};

【讨论】:

    【解决方案3】:

    您需要在构造函数中声明您的成员变量,而不是让它们成为原型的一部分。 javascript 中的 oop 可能丑陋且不直观。 (这就是为什么有这么多用于 javascript 的 oop 库的原因)

    Using ds.oop

    ds.make.class({
        type: 'MyClass',
        constructor: function(x){
            this.a = x;
        }
    });
    
    var c1 = new MyClass(1);
    var c2 = new MyClass(2);
    
    console.log( c1.a ); // output: 1
    console.log( c2.a ); // output: 2
    

    【讨论】:

      【解决方案4】:

      你可以得到想要的结果如下:

      myclass = function() {
          this.data = Math.random(1000);
      };
      
      //myclass.prototype.data = [];
      
      var a = new myclass();   
      var b = new myclass();
      

      jsfiddle

      【讨论】:

      • 呃,Math.random() 不接受参数,也不返回数组。我不知道这怎么可能满足 OP 的要求。您只是将一个随机数放入this.data。 OP 希望每个实例都有一个唯一的数组,该数组具有唯一的值。
      • 随机不带参数是正确的,但请仔细阅读问题。他不要求一个数组,他只是问为什么同一类的两个实例返回相同的随机数值。这个答案不满足这个问题吗?请参阅 jsfiddle。
      猜你喜欢
      • 2017-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-03
      • 2011-04-13
      相关资源
      最近更新 更多