Prototype Class.create没有正确子类化

时间:2011-03-04 19:53:09

标签: javascript oop prototype

所以,我正在尝试扩展一个谷歌地图类,特别是google.maps.OverlayView(在v3中)。这样做的香草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 个答案:

答案 0 :(得分:2)

超类参数需要是一个合适的原型“类” - 请记住,JavaScript中并不存在类。 JavaScript有几种经典的继承模式,您应该能够通过手动代理构造函数和原型来获取原型链(包括对父“类”及其原型的引用)。

来自prototype's class.js

  

[[Class.create]]接受两种参数。如果第一个参数是   a [[Class]],它被用作新类的超类,以及它的全部   方法是继承的。否则,传递的任何参数都被视为   对象及其方法作为实例方法复制(“混入”)   新课程。