2014-11-01 21 views
0

Я пытаюсь получить два объекта из одного и того же определения класса. Однако они, похоже, имеют один и тот же атрибут. Что я могу сделать?javascript new не создает новый объект

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

+0

@elclanrs, как бы я decalre это как собственная собственность? – Merion

ответ

0

Я просто делал это для чего-то другого!

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

}; 

Теперь вы можете получить доступ к нему моей просто делать myclass.data =

Лично это, как я хотел бы сделать это:

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

Тогда вы можете пойти myNameSpace.myfunction() или myNameSpace.myVar = Значение

+0

Этот ответ довольно запутан. Почему вы используете пространство имен? Почему вы изменили 'data' на' somevariable'? Почему вы не написали «Кодекс» полностью? И в чем смысл '|| {} 'в конце? –

+0

Я использую пространство имен, потому что, если он будет продолжать свой путь, ему будет нужно, чтобы его код был доступен из многочисленных мест в его приложении, поэтому имеет смысл иметь его там. Вопрос не касался каких-либо конкретных данных, связанных с переменным охватом, так как для || {} Я, кажется, переборщил свой разрез и вставку или перепутал его –

+0

Даже крупные проекты не всегда выигрывают от пространства имен внутри файла. Во всяком случае, код OP, вероятно, будет сдержанной версией гораздо более длинного скрипта (поэтому мы можем сосредоточиться на том, что важно), который может уже содержать пространство имен. Я понимаю, что объяснение общих принципов, по крайней мере, так же важно, как исправление этой ошибки, но я все еще говорю, что переименование «данных» было путаным. Нет необходимости указывать, что тот же принцип применяется независимо от имени свойства. Иногда бывает полезно указать, что проблемы, возможно, пропустили, но вы должны уточнить, что это отступление, а не часть ответа. –

-1

Вы можете получить желаемые результаты следующим образом:

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

//myclass.prototype.data = []; 

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

jsfiddle

+0

Uhhh, 'Math.random()' не принимает аргумент и не возвращает массив. Я не знаю, как это могло бы сделать то, о чем попросил ОП. Вы просто помещаете случайное число в 'this.data'. OP хочет уникальный массив для каждого экземпляра, который высевается с уникальным значением. – jfriend00

+0

Вы правы о случайном не принимая параметр, но, пожалуйста, внимательно прочитайте вопрос. Он не запрашивает массив, он просто спрашивает, почему два экземпляра одного класса возвращают одно и то же значение случайного числа. Не отвечает ли этот ответ на этот вопрос? См. Jsfiddle. –

0

Просмотреть комментарии от elclanrs.

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

Вам нужно объявить переменную-член внутри конструктора вместо того, чтобы сделать их частью прототипа. oop в javascript может быть уродливым и неинтуитивным. (Вот почему так много библиотек OOP там для 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 

 Смежные вопросы

  • Нет связанных вопросов^_^