原型 属性 未在自定义 OL3 控件的构造函数内定义

Prototype property not defined inside a constructor of a custom OL3 control

我正在尝试在 ol3 中创建自定义控件。我遇到了 this example 并决定制作一些 class 而不是整个页面上的一大堆代码。所以我有这样的东西:

var MeasureLength = function ( opt_options ) {
    var options = opt_options || {};

    var button = document.createElement( 'button' );
    button.innerText = 'M';

    button.addEventListener( 'click', this._trigger, false );

    var element = document.createElement( 'div' );
    element.className = 'measure-length ol-control';
    element.appendChild( button );

    ol.control.Control.call( this, {
        element: element,
        target: options.target
    } );
};

MeasureLength.prototype._trigger = function ( e ) {
    e.preventDefault();
    alert("Activating!");
};

ol.inherits( MeasureLength, ol.control.Control );

问题是 _trigger 没有被调用。使其工作的一种方法是将 _trigger 放在构造函数中:

var _trigger = function ( e ) {
    e.preventDefault();
    alert("Activating!");
};
button.addEventListener( 'click', _trigger, false );

但我不喜欢那样,因为代码又堆成一堆,所有 OOP 都崩溃了。

所以我的问题是:当您有很多代码时,在 ol3 中创建自定义控件的最佳做法是什么?

闭包的 inherits 函数用父实例覆盖子实例的 prototype

如果您在调用 inherits 后附加 _triggered 属性,它应该在您的子构造函数中可用:

var MeasureLength = function ( opt_options ) {
    // should now be available
    console.log(this._trigger);
};

ol.inherits( MeasureLength, ol.control.Control );

MeasureLength.prototype._trigger = function ( e ) {
    e.preventDefault();
    console.log("Activating!");
};