2014-11-01 64 views
0

我想从同一个类定义中获取两个对象。但是他们似乎共享相同的属性。我能做什么?JavaScript新不会创建新对象

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 
+2

'data'是共享的,因为你把它的原型。在构造函数中声明'data'作为自己的属性。另外,使用'var'声明你的变量,并且把你的构造函数作为一个惯例来使用,所以你不要忘记'new'。 – elclanrs 2014-11-01 19:37:41

+0

@elclanrs我将如何decalre它作为自己的财产? – Merion 2014-11-01 19:38:39

回答

0

我刚刚做这个做了别的东西!

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

}; 

现在,您可以访问它我简单地做myclass.data =

个人,这是怎么我会做到这一点:

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

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

+0

这个答案相当混乱。你为什么使用命名空间?你为什么要将'data'改成'somevariable'?为什么你没有完全写出一些代码呢? “||”有什么意义? {}'在最后? – 2014-11-01 20:35:31

+0

我使用的是一个名称空间,因为如果他继续他要去的方式,他将需要从他的应用程序中的许多地方访问他的代码,所以它有意义。这个问题与数据没有任何关系,特别是与变量范围有关,就像|| {}我似乎超过了我的剪切和粘贴或混合起来 – 2014-11-01 20:38:26

+0

即使大型项目并不总是从文件中的命名空间中受益。无论如何,OP的代码很可能是一个更长的脚本的简化版本(所以我们可以专注于重要的内容),它可能已经包含命名空间。我意识到解释一般原则至少与修复这个bug一样重要,但我仍然说重命名'data'是令人困惑的。没有必要指出,无论属性名称如何,同样的原则都适用。指出OP可能错过的问题有时是好事,但你必须澄清这是一个偏离题,而不是答案的一部分。 – 2014-11-01 21:03:02

-1

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

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

//myclass.prototype.data = []; 

var a = new myclass(); 
var b = new myclass(); 

jsfiddle

+0

Uhhh,'Math.random()'不接受参数并且不返回数组。我不知道这怎么可能做OP要求的。你只是把一个随机数字放入'this.data'中。 OP希望为每个采用唯一值播种的实例分配一个唯一的阵列。 – jfriend00 2014-11-01 20:05:30

+0

关于随机不带参数的说法是正确的,但请仔细阅读问题。他没有要求数组,他只是问为什么同一个类的两个实例返回相同的随机数值。这个答案不能解决这个问题吗?看到j​​sfiddle。 – 2014-11-01 20:18:45

0

查看来自elclanrs的评论。

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

您需要在构造函数中声明您的成员变量,而不是使它们成为原型的一部分。在JavaScript中操作可能会变得丑陋而且不直观。 (这就是为什么有这么多的接力库在那里的JavaScript)

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