Prototype Class.create неправильно создает подклассы - PullRequest
4 голосов
/ 04 марта 2011

Итак, я пытаюсь расширить класс карт Google, в частности google.maps.OverlayView (в версии 3). Делая это, Vanilla JS полностью работает.

POIOverlay = function(marker, poi, type)
    {
        this._marker = marker;
        this._poi = poi;
        this._type = type;
        this._div = null;
        this.latlng_ = marker.getPosition();
        this._map = marker.getMap();
        this._offsetVertical = -195;
        this._offsetHorizontal = 0;
        this._height = 165;
        this._width = 266;
    }
    POIOverlay.prototype = new google.maps.OverlayView();
    POIOverlay.prototype.create = function()
    {
       console.log(this)
    }
    POIOverlay.prototype.draw = function()
    {
        //stuff
    }

Однако, делая это способом прототипа, не удается добавить ни один из методов родительского класса:

POIOverlay = Class.create(new google.maps.OverlayView(), {
    initialize : function(marker, poi, type)
    {
        this._marker = marker;
        this._poi = poi;
        this._type = type;
        this._div = null;
        this.latlng_ = marker.getPosition();
        this._map = marker.getMap();
        this._offsetVertical = -195;
        this._offsetHorizontal = 0;
        this._height = 165;
        this._width = 266;
    },
    create : function()
    {
        if(this._div) return;
        console.log(this);
    },
    draw : function()
    {
        //stuff
    }  
});

Вот код для создания экземпляра / использования класса:

    try
    {
        poio = new POIOverlay(marker,poi,type);
    }
    catch(e)
    {
        console.log(e);
    }

    google.maps.event.addListener(marker, 'click',
        poio.draw.bind(poio)
    );

В первом примере консоль регистрирует объект с помощью родительских и дочерних методов / атрибутов. Во втором примере консоль регистрирует объект без родительских атрибутов / методов.

Очевидно, что это не слишком большая сделка, но мне было интересно, кто-нибудь еще сталкивался с этой проблемой и легко ли ее исправить. Я использую прототип 1.7.

1 Ответ

2 голосов
/ 05 марта 2011

Аргумент суперкласса должен быть правильным прототипом «Класс» - помните, что классы на самом деле не существуют в JavaScript.Существует несколько классических шаблонов наследования для JavaScript, и вы сможете получить цепочку прототипов (включая ссылку на родительский «класс» и его прототип), вручную проксируя конструкторы и прототипы.

От прототип class.js :

[[Class.create]] принимает два вида аргументов.Если первый аргумент является [[Class]], он используется как суперкласс нового класса, и все его методы наследуются.В противном случае любые передаваемые аргументы обрабатываются как объекты, а их методы копируются («смешиваются в») как методы экземпляров нового класса.

...