Próbuję wypełnić obiekt za pomocą klasy JavaScript. Nie jestem nawet pewien, czy robię to poprawnie, jestem bardzo nowy w JavaScript OOP.

var ImagesViewModel = {}; // Global object

function ImagesClass() {

    this.addImage = function (iUrl) {
        ImagesViewModel.push({ "ImageUrl": iUrl }) //<  Error is here
    }

}

var k = new ImagesClass()
k.addImage("http://www.yahoo.com")
k.addImage("http://www.xbox.com")

Zasadniczo potrzebuję łatwego sposobu wypełnienia ImagesViewModel z wieloma właściwościami. Czy muszę określić właściwości w ImagesViewModel? Może mogę to zrobić, bez konieczności określania zmiennej globalnej?

Dostaję błąd

Obiekt nie ma metody

0
highwingers 27 listopad 2013, 02:55

3 odpowiedzi

Najlepsza odpowiedź

Co chcesz, jest tablicą, a nie obiekt, push to metoda na prototypie tablicy i próbujesz go użyć na obiekcie.

Zmiana:

var ImagesViewModel = {};

Do:

var ImagesViewModel = [];

Możesz to zrobić tak dobrze, aby każda instancja ImagesClass ma swój własny zestaw obrazów.

function ImagesClass() {
    var  _images = [];

    this.addImage = function (iUrl) {
       _images.push({ "ImageUrl": iUrl }) //<  Error is here
    }

    this.getImages = function(){
      return _images;
    }
}

I użyj go jako:

var k = new ImagesClass();
k.addImage("http://www.yahoo.com");
k.addImage("http://www.xbox.com");
var ImagesViewModel = k.getImages(); //You can either set it directly or as a property of object
console.log(ImagesViewModel);

Demo

4
PSL 26 listopad 2013, 23:12

Metoda push jest tylko dla tablic, tutaj próbujesz naciskać () do obiektu, dlatego nie działa.

Musisz zmienić var ImagesViewModel = {}; do var ImagesViewModel = [];

1
Jay Huang 26 listopad 2013, 22:58

Z perspektywy projektu prawdopodobnie nie chcesz, aby Twój Viewmodel jest tylko płaską tablicą (mimo że zadeklarowałeś go jako obiekt, ponieważ wskazano inne plakaty).

Sugerowałbym deklarowanie deklaracji tablicy, aby utrzymać obrazy wewnątrz obiektu zdjęćWiewmodel.

var ImagesViewModel = { // ViewModel generic OBJECT
  this.Images = new Array(); // prototype ARRAY object
}; 

function ImagesClass() {    
    this.addImage = function (iUrl) {    
        ImagesViewModel.Images.push({ "ImageUrl": iUrl }) 
    }

}
1
Ryan Nigro 26 listopad 2013, 23:00