JS nie znajduje definicji funkcji


(Brzegowski) #1

Witam

Piszę aplikację opartą o Google Maps API 3. Mam taki oto kod:

function MapElement() {

    MapElement.prototype.latLng = new google.maps.LatLng(0, 0);

    MapElement.prototype.errorMargin = 3.5;

    MapElement.prototype.toString = mapElementToString();

}


function mapElementToString() {

    return '' + this.latLng.lat() + '' + this.latLng.lng() + '' 

        + this.errorMargin + '';

}

Mój problem polega na tym, że przeglądarka nie zna funkcji lat(), której używam w funkcji mapElementToString().

Ten obiekt i funkcja znajduja się w pliku *.js, który dołączam do innego pliku *.html. W pliku *.html ładuję także API Google Maps.

Teraz chciałbym się dowiedzieć, jak zrobić, aby ta funkcja lat() była znana w tym pliku.

Proszę o odpowiedź - za wszystkie z góry dziękuję. :slight_smile:


(Wszerad91) #2

funkcja będzie znana dopiero kiedy się załaduje, dlatego musisz zadbać aby skrypt ruszył dopiero po załadowaniu tego pliku.


(Kubarek) #3

W funkcji mapElementToString, obiekt this wskazuje na window, a nie na twój obiekt typu MapElement. Najprościej to będzie użycie takiej konstrukcji:

var _self = this;

MapElement.prototype.toString = function() {

  mapElementToString.call(_self);

}

Funkcja call przekazuje właściwy obiekt this do funkcji i od razu wywołuje tę funkcję :slight_smile:


(Brzegowski) #4

Teraz mam coś takiego:

function MapElement(name, latLng, errorMargin) {

    this.name = name || "Noname element";

    this.latLng = latLng || new google.maps.LatLng(0, 0);

    this.errorMargin = errorMargin || 2;

    this._self = this;

    MapElement.prototype.toString = function () {

        mapElementToString(this._self);

    }

}


function mapElementToString(self) {

    return '' + self.latLng.lat() + '' + self.latLng.lng() + '' 

        + self.errorMargin + '';

}

Co prawda błędu już nie wywala, ale jeśli utworze ten obiekt i wywołam funkcję toString():

var element_mapki = new MapElement("Tower Bridge", towerBridge, 2);

alert(element_mapki.toString());

To w alercie otrzymuję wynik: "undefined". :confused:

Co zrobiłem nie tak? :slight_smile:


(Kubarek) #5

A co Ci zwraca funkcja MapElement.prototype.toString? Jest tam słówko kluczowe return? :slight_smile:


(Brzegowski) #6

Tak masz rację, brakowało słówka return. ;D

Dziękuję Wszystkim bardzo za pomoc. :slight_smile: