Как переопределить объект библиотеки 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'
})
//...