如何在javascript中重新定义私有方法?

时间:2016-04-08 15:03:05

标签: javascript jquery

我从Trumbowyg插件创建组件到vue.js库。我需要在这个漂亮的所见即所得编辑器中添加双向绑定。 如何重写buildEditor()方法? 这种方法是私密的。如何正确地做到这一点?

<script>
jQuery.trumbowyg = {
    // options object
};

(function (navigator, window, document, $, undefined) {

    $.fn.trumbowyg = function (options, params) {
        // ... code ...
        $(this).data('trumbowyg', new Trumbowyg(this, options));
        // ... code ...
    };

    var Trumbowyg = function (editorElem, o) {
        var t = this;
        // ... code ...
        t.init();
    };

    Trumbowyg.prototype = {
        init: function () {
            var t = this;

            t.buildEditor();
            // ... code ...
        },

        buildEditor: function () {
            // i need rewrite this method
        }
        // code for otner method

    };
})(navigator, window, document, jQuery);

// -------------------------------------
// other file. I want init this plugin

// here do need to rewrite buildEditor() method? What best way to do this?

$(&#39; .selector&#39)。trumbowyg();

2 个答案:

答案 0 :(得分:1)

如果这个插件没有返回&#39; Trumbowyg&#39;变量它是不可能的。我建议使用fork这个插件并使用您的设置创建自己的版本。

答案 1 :(得分:1)

最好的方法是自己分叉插件,as Slava answered。但技术上你能够修改该功能。

每当构造一个类时,该实例都有自己的constructor属性。这等于类函数。

因此,如果您可以访问Trumbowyg的实例,则可以使用其类:

$foo.trumbowyg(...)
var trumbowyg = $foo.data('trumbowyg')
var TrumbowygClass = trumbowyg.constructor

现在我们可以修改它的原型:

TrumbowygClass.prototype.buildEditor = function() {
  // ...
}

您可能希望$foo成为临时或未使用的元素。这是因为它会调用旧buildEditor(只要您运行$foo.trumbowyg()),而不是您自己的修改版本。

在您设置原型函数后,您可以在实际要使用的元素trumbowyg上运行它(例如$('#target')

举个例子:

&#13;
&#13;
(function() {
  window.makeInstance = function() {
    return new HiddenClass()
  }

  var HiddenClass = function() {
    this.setGreeting()
    this.showGreeting()
  }

  HiddenClass.prototype.setGreeting = function() {
    this.greeting = 'Hello, world!'
  }

  HiddenClass.prototype.showGreeting = function() {
    console.log(this.greeting)
  }
})()

var myTempInstance = makeInstance()
// Should log 'Hello, world!'

var HiddenClass = myTempInstance.constructor
console.log(HiddenClass) // Should be the HiddenClass function

// Now we overwrite our function..
HiddenClass.prototype.setGreeting = function() {
  this.greeting = 'Redefined!'
}

var myUsedInstance = makeInstance()
// Should log 'Redefined!', since we redefined setGreeting

// And later we can use `myUsedInstance`.
// In this code myTempInstance is like $foo, and myUsedInstance
// is like $('#target').
&#13;
&#13;
&#13;