Как переопределить объект библиотеки JavaScript this.function(arg, function(){

Я пытаюсь переопределить функцию в модуле дерева blessed-contrib. Однако я думаю, что я что-то упускаю в способе наследования объектов. Любая помощь будет принята с благодарностью.

Оригинальный код:

function Tree(options) {
//...
  this.rows = blessed.list({
    top: 1,
    width: 0,
    left: 1,
    style: options.style,
    padding: options.padding,
    keys: true,
    tags: options.tags,
    input: options.input,
    vi: options.vi,
    ignoreKeys: options.ignoreKeys,
    scrollable: options.scrollable,
    mouse: options.mouse,
    selectedBg: 'blue',
  });

  this.append(this.rows);

  this.rows.key(options.keys, function() {
    var selectedNode = self.nodeLines[this.getItemIndex(this.selected)];
    if (selectedNode.children) {
      selectedNode.extended = !selectedNode.extended;
      self.setData(self.data);
      self.screen.render();
    }

    self.emit('select', selectedNode, this.getItemIndex(this.selected));
  });

//...

Я пытаюсь переопределить this.rows.key(options.keys, function() { функция в моем собственном коде. Я пытаюсь сделать что-то вроде следующего, но я не уверен, как путь к объекту работает для чего-то, что в конечном счете имеет тип blessed-contrib.tree.list в этом случае.

Мой код выглядит примерно так:

"use strict";
var blessed = require('blessed'),
    contrib = require('blessed-contrib');

//...

//create layout and widgets
var grid = new contrib.grid({rows: 1, cols: 2, screen: screen})

var tree =  grid.set(0, 0, 1, 1, contrib.tree,
    {
        style: {
        text: "red", fg: 'blue',
        selected: {
            bg: 'yellow', fg: 'white'
        }
    },
        // keys: ['+', 'space'],
        vi: true,
        template: { lines: true },
        label: 'Filesystem Tree'
    })

// monkeypatch contrib.tree.rows.key(options.keys, function() {}

// save the original
var old_tree_rows_key =  tree.rows.key;

//tree.rows.key = function(options_keys) {
tree.rows.key = function(options_keys) {
    var selectedNode = self.nodeLines[this.getItemIndex(this.selected)];

    // handle items in options.keys array on my own for custom purposes
    // ...

    // Code I want commented out:
    // if (selectedNode.children) {
    //   selectedNode.extended = !selectedNode.extended;
    //   self.setData(self.data);
    //   self.screen.render();
    // }

    self.emit('select', selectedNode, this.getItemIndex(this.selected));
  };

//...

1 ответ

Решение

Хорошо, спасибо @ Берги! Его подсказка привела меня к javascript - Почему невозможно изменить функцию конструктора из прототипа?, Я думал, что у меня должен быть более глубокий доступ к объекту, и мне не нужно было бы копировать весь конструктор, но я ошибался.

мой окончательный код выглядит так:

"use strict";

var blessed = require('blessed'),
    contrib = require('blessed-contrib'),
    Node = blessed.Node,
    Box = blessed.Box;

//...

// monkeypatch contrib.tree constructor to change keyhandler

// save the original
var old_tree =  contrib.tree.prototype;

//function Tree(options) {
contrib.tree = function(options) {

  if (!(this instanceof Node)) return new contrib.tree(options);

  var self = this;
  options = options || {};
  options.bold = true;
  this.options = options;
  this.data = {};
  this.nodeLines = [];
  this.lineNbr = 0;
  Box.call(this, options);

//...

  this.rows.key(options.keys, function() {
    var selectedNode = self.nodeLines[this.getItemIndex(this.selected)];
    // if (selectedNode.children) {
    //   selectedNode.extended = !selectedNode.extended;
    //   self.setData(self.data);
    //   self.screen.render();
    // }

    self.emit('select', selectedNode, this.getItemIndex(this.selected));
  });
//...
};

// restore binding
contrib.tree.prototype = old_tree;

var tree =  grid.set(0, 0, 1, 1, contrib.tree,
    {
        style: {
        text: "red", fg: 'blue',
        selected: {
            bg: 'yellow', fg: 'white'
        }
    },
        // keys: ['+', 'space'],
        vi: true,
        template: { lines: true },
        label: 'Filesystem Tree'
    })
//...
Другие вопросы по тегам