2014-11-01 73 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