制作一个javascript"函数对象";继承他人

Make a javascript "function object" inherit from another

本文关键字:quot 函数 继承 对象 javascript 一个      更新时间:2023-09-26

在Javascript中,可以通过使用函数构造函数及其"prototype"属性(即"未来实例的父对象"(或最近的Object.create((来获得新对象,从而进行某种继承。

然而,最近我需要为我的一个项目"重写"Jquery对象("$"(,也就是说,提供一个类似的函数,它也具有所有的fn/extend/。。。[继承]原始"jQuery"工厂函数的属性。

目标是有一个"$(("函数,默认情况下,它总是接收"window.pparent"作为第二个参数,这样整个程序就修改了父框架,而不是加载程序的iframe。

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

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

尽管我尝试了很多次,但都没能让它发挥作用,当使用"new"关键字时,我总是得到简单的对象而不是真正的函数,或者继承不起作用。我找到了其他方法(例如,将$中的所有属性复制粘贴到我的新函数对象中(,但在我看来,这是一种糟糕的做事方式。

有没有任何方法可以创建一个新的函数对象,该对象具有原始的$对象作为父对象/原型?

虽然函数是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);
}