2011-03-04 2 views
4

Итак, я пытаюсь расширить класс карт google, в частности google.maps.OverlayView (в версии 3). Выполнение этого метода vanilla js полностью работает.Prototype Class.create не подклассы правильно

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.

+0

Интересно, должен ли родительский класс быть создан с помощью собственной системы Prototype? – Pointy

ответ

2

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

От prototype's class.js:

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

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