制作一个javascript"函数对象";继承他人
Make a javascript "function object" inherit from another
在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);
}
- Javascript复选框函数:;缺少:在属性id之后"
- 为什么spyOn"停止函数“”的所有执行;Jasmine(要求澄清Jasmine 2.2间谍文件)
- 得到"未定义不是函数“;使用显示原型图案时出错
- 什么是"!函数(){}〃;javascript中的mean/do
- 我对“;返回true"嵌套函数内部;t工作
- 为什么"构造函数是一种特殊情况;
- 如何分解jQuery"toggle”;函数转换为separate“;显示“;以及“;隐藏“;功能
- "这个“;函数的作用域无效
- "未定义不是函数“;错误jQuery,.replaces,scrollTop
- 我收到一个类型错误,其中包含-"$不是函数“;使用noConflict时
- 传递带有符号“”的字符串变量'"到函数
- "撤消”;Javascript中的DOM操作函数
- JavaScript美学:;函数foo(){}"vs“;var foo=函数(){}"AMD功能
- 得到"TypeError:对象不是函数“”;在forEach循环中使用超级测试/超级代理时
- “=>"在javascript中定义函数的语法及其意义
- "可变变量可从闭包“”访问;在传递给Array.prototype.every的函数中
- "未捕获的类型错误:未定义的不是函数“;当向输入字段添加值时
- "对象不是函数“;当将Node.js HTTP服务器对象传递给Socket.IO时
- AngularJS'ng:areq错误参数"{controller}不是函数“;,CodeIgnite
- 页面不可滚动,其中ng include=“”;函数()"-该代码已不再使用