使javascript“函数对象”继承自另一个

时间:2015-07-03 20:09:35

标签: javascript jquery inheritance prototype

在Javascript中,通过使用函数构造函数及其“原型”属性(即“未来实例的父”)或最近的Object.create()来获取新对象,可以进行某种继承。

但是最近我需要“覆盖”我的一个项目的Jquery对象(“$”),也就是说,提供一个类似的函数,它也包含所有fn / extend / ... [inherited]原始“jQuery”工厂函数的属性。

目标是使用“$()”函数,默认情况下始终将“window.parent”作为第二个参数,以便整个程序修改父框架而不是加载程序的iframe。

通常我希望能够做到这样的事情:

var oldJQ = $;
$ = function (selector) {
    return oldJQ(selector, window.parent);
}
$.__proto__ = oldJQ .__proto__;

$.extend({...});  // must work

尽管尝试了很多次,但我无法使用它,在使用“new”关键字时,我总是使用简单的对象而不是实际的函数,或者继承不起作用。我找到了替代方法(例如,通过将所有属性从$复制粘贴到我的新函数对象中),但在我看来,这似乎是一种可怕的做事方式。

有没有办法让一个新的函数对象作为父/原型具有原始的$ object?

1 个答案:

答案 0 :(得分:1)

虽然函数是javascript中的对象,但它们不是常规对象。具体来说,它们是继承被破坏的对象。函数不是语言中唯一的这样的对象,DOM元素同样是残障的。这就是jQuery实现为DOM包装而不是通过继承扩展DOM功能的原因之一。

幸运的是,虽然OOP在这种情况下不起作用,但我们可以从jQuery本身获取灵感并使用FP来完成我们需要的工作。换句话说,虽然你不能继承函数,但你可以将它包装在另一个函数中。

例如,如果您的应用需要一个特殊的console.log功能,可以将日志发送回您的服务器,您可以通过重新定义它来覆盖它:

var log_orig = console.log;
console.log = function () {
    ajaxlog([].slice.call(arguments,0).map(function(x){
        return JSON.parse(x);
    }).join(',');
    log_orig.apply(console,arguments);
}

或者,如果您想要一个额外的特殊版本$

function $$ () {
    /*
     * do extra stuff
     */
    return $.apply(null,arguments);
}

或者,如果您想要覆盖$,而不是包装:

var old$ = $;
function $ () {
    /*
     * do extra stuff
     */
    return old$.apply(null,arguments);
}