【问题标题】:Make a javascript "function object" inherit from another让一个javascript“函数对象”从另一个继承
【发布时间】:2015-07-03 20:09:35
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

  • “我总是得到简单的对象而不是真正的函数”。考虑function 不是实际的数据类型。 These 是唯一的实际数据类型。这说明清楚了吗?
  • 不,这是不可能的。对象只能有一个原型,从Function 继承的东西是不可调用的。 ES6 代理可能会有所帮助,但这并不完全相同。
  • 我建议您观看 this 以更好地了解继承的工作原理。
  • 感谢您的回答,因此它确认“函数对象”,如著名的“$”,不能简单地通过原型继承共享属性...

标签: javascript jquery inheritance prototype


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    • 2011-05-13
    • 2011-06-12
    相关资源
    最近更新 更多