javascript wrapper函数
在设计javascript的继承体系时,有一个重要需求,方法链。通俗地说,说是在方法中调用父类的同名方法。类似java的this.super().method()。如何把父类的同名方法包装到子类中呢?这就要用到wrapper函数。之所以叫wrapper,而不是wrap,因为它比wrap更加wrapper。比如像Ext那种深度继承的结构中,如果父类没有找祖父,祖父没有找曾祖父,沿着原型链层层上溯,以获取它所需要的功能。此外,wrapper函数在jQuery也有应用,好像分为三种wrapAll,wrapinner,wrap,专门用来对付IE的table或其他DOM。可能还有其他用处,不管了,先看如何实现它。
一个普通的函数
var greeting = function(world){
return "hello " + world +"!";
};
alert(greeting("world"));
var greeting = function(world){
return "hello " + world +"!";
};
alert(greeting("world"));
运行代码
我们把它塞进更深一层的作用域,非bind函数。
var wrap= function(fn){
return function(){
return fn.apply(null,arguments);
};
};
var wrap= function(fn){
return function(){
return fn.apply(null,arguments);
};
};
var greeting = function(world){
return "hello " + world +"!";
};
alert(greeting("world"));
alert(wrap(greeting)("world"))
运行代码
但这只是延迟了它的执行时间而已。上面函数中的null,也可以换成window。
var wrap= function(fn){
return function(){
return fn.apply(window,arguments);
};
};
var wrap= function(fn){
return function(){
return fn.apply(window,arguments);
};
};
var greeting = function(world){
return "hello " + world +"!";
};
alert(greeting("world"));
alert(wrap(greeting)("world"))
运行代码
因为总要人去调用函数的,null没有此能力,就由window上。现在我们就是要在这个位置上做文章,把换成this。如果没有进一步的改进,这里的this还是window的替身。下面就开始复杂了,先分解一下写法,降低阅读难度,就像jQuery那样把它掰成三部分:
var wrapper= function(fn){//这里改一下名。
var temp = function(){
相关文档:
scrollHeight: 获取对象的滚动高度。
scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离
scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离
scrollWidth:获取对象的滚动宽度
offsetHeight:获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度
offsetL ......
Javascript 本身并不直接支持继承,不过javascript强大之处就在于其无比的灵活性,你基本可以为所欲为。
1. 通过在子类中调用父类的构建函数来实现继承。
2. 用Prototype来实现继承。
3. 常见framework是如何实现继承的。
4. 总结 ......
JavaScript 是 Web 开发与设计中不可或缺的东西,不管是一个简单的网页还是一个专业的站点,也不管你是高手还是菜鸟,如今
JavaScript 库越来越强大,可以胜任许多复杂的工作,然而同时,人们在众多 JavaScript 库面前又觉得无所适从,本文,我们将使用
Google 搜索出排名前 10 位的 JavaScript 库,并对它们逐一进行介绍 ......
网上很多文章都转载了一段话:对于函数来说,caller 属性只有在函数执行时才有定义。
到底是不是呢?可以用下面这段代码测试一下(这段例子也是转载文章中使用的):
function callerDemo() {
if (callerDemo.caller) {
var a= callerDemo.caller.toString();
alert(a);
} else {
......
1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键
<table border oncontextmenu=return(false)> <td>no </table> 可用于Table
2. <body onselectstart="return false"> 取消选取、防止复制
3. onpaste="return false" 不准粘贴
4. oncopy="return false;" onc ......