Частично переопределить прототип? - PullRequest
0 голосов
/ 21 февраля 2019

Есть ли способ частично переопределить прототип?

Я использую fabricjs и хочу переопределить событие onKeyDown для класса Textbox.Цель состоит в том, чтобы поведение ключа Enter отличалось от поведения по умолчанию.

Я пробовал этот подход

fabric.Textbox.prototype.onKeyDown = (function(onKeyDown) {
    return function(e) {
        if (e.keyCode === 46) console.log('blur');
        // else super(e); <== default behavior would be appreciated here

        onKeyDown.call(this, e);
    }
})(fabric.Textbox.prototype.onKeyDown);

В результате ключ Enter только работал, иуже существующая функциональность, реализованная разработчиком / командой Fabric, потеряна.Я хочу, чтобы onKeyDown работал так, как предполагалось, из коробки, но вместо поведения Enter фабричной структуры по умолчанию мне нужно мое пользовательское поведение Enter для упомянутого события.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Добавьте свой код ключа к keysMap и назначьте свой метод.

DEMO

fabric.Textbox.prototype.keysMap[13] = 'onEnterKeyPressed';

fabric.Textbox.prototype.onEnterKeyPressed = function(e){
  console.log('enter key pressed')
}

var canvas = new fabric.Canvas('c');
var textbox = new fabric.Textbox('FABRICJS')
canvas.add(textbox)
canvas{
  border:1px solid;
}
<script src="http://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.6.0/fabric.js"></script>
<canvas id='c' width=400 height=400></canvas>
0 голосов
/ 21 февраля 2019

Я думаю, что-то вроде этого будет работать:

// cache original function
const stockKeyDown = fabric.Textbox.prototype.onKeyDown

// override prototype
fabric.Textbox.prototype.onKeyDown = function(e) {
  if (e.keyCode === 46) {
    console.log('blur')
    return
  }

  // call cached version
  stockKeyDown.call(this, e)
}
...