第五章
9、Function函数
1) 函数内部有两个特殊的对象:
(1) arguments(主要用于保存函数参数,有一个属性callee,这是一个指针,指向拥有arguments对象的函数),但是在函数严格模式下,arguments.callee会出错,这时候可以使用函数表达式来完成
eg:
var fac = (function f(num){ return num*f(num-1); });
(2) this
2) 属性:length(参数个数)和prototype(保存实例的方法,比如:toString()和valueOf())
3) apply()接收2个参数:运行函数的作用域(this或其他)和参数数组(arguments,[ , , ,]),在严格模式下,this不会转型为window,要明确把函数加入到某个对象中,不然将指向underfined。
call()接收多个参数:第一个参数运行函数的作用域(this或其他)和剩下的是传入的各个参数,用,分隔
以上两个属性用来扩充函数赖以运行的作用域:
比如:
window.color = “red”; var o = {color:”blue”}; function f(){ alert(this.color); } f(); f.call(this);//red f.call(window);//red f.call(o);//blue
4) bind()创建函数的实例,比如:f.bind(o);//blue
5) 特殊引用类型:Boolean、Number、String -------------------------------àObject
(1) Boolean中的所有对象都会返回true,尽管传false的值给它,比如:var s = new Boolean(false);
(2) Number:
(1st) toFixed()方法会按照指定小数返回数值的字符串:
var num = 10;
num.toFixed(2);//10.00
(2nd) toExponential()【num. toExponential();//1.0e+1】和toprecision()
【 num. toprecision(1)//1e+1
num. toprecision(2)//10
num. toprecision(3)//10.0
】
(3) String:
(1st) charAt(1)字符位置的那个字符、stringValue[1]àie8以上可用
(2nd) charCodeAt(1) 字符位置的那个字符编码
(3rd) concat();添加字符串;比如:s.concat(“das”);
(4th) slice()[eg: slice (2,7),2是开始位置,7是结束位置]
(5th) substr()[eg:sunstr(2,7),2是开始位置,7是字符个数]
(6th) substring()[eg: substring (2,7),2是开始位置,7是结束位置]
(7th) trim();去除字符串前后位置的空白格
(8th) search();找到返回第一项匹配的索引,没有返回-1
eg:var text = “cat , bat”;
var pos = text.search(/at/);//1
(9th) replace();第一个参数可以是字符串也可以是正则表达式,第二个是替换 的内容,可以是参数也可以是函数;
$n: text. replace(/.at/g,”word($1)”);// word(cat), word(bat)
(10th) split(),分隔符,可一个参数,也可两个参数【第二个指定数组大小】
(11th) localCompare(),比较字符串,前大于后(-1),前小于后(1),等于(0)
(12th) String的fromCharCode()与charCodeAt()相反操作
eg: String. fromCharCode(104,101);//he
(13th) Golbal:编码:
encodeURIComonpent()[对非标准字符进行编码{:、/、?、#}进行编码]
eg:eval(“function f(){执行代码}”);
(14th) Math方法:max()、min()、SQRT2、SQRT1_2、ceil()[向上舍入]、floor()[向下舍入]、round()[标准舍入]、random()[随机数]、abs[绝对值]
第六章
1、 数据属性:(不要再ie8使用)
configurable:默认true,是否通过删除修改属性的值
enumerable:默认true,是否通过for-in循环返回属性
writable:默认true,能否修改属性的值
value:属性的数据值,默认underfined
修改属性的默认特性,需要使用Object.defineProperty()
eg:var person = {};
Object.defineProperty({person,”name”,{ writable:false,value:”ccl” }})【ie9+、fixfox 4+、Safari 5+、Opera 12+、Chrome】
2、 访问器属性:
configurable:默认true,是否通过删除修改属性的值
enumerable:默认true,是否通过for-in循环返回属性
get:读取属性调用的函数值,默认underfined
set:写入属性调用的函数值,默认underfined
修改属性的默认特性,需要使用Object.defineProperty(),在严格模式下,get和set需要同时使用,不然会抛出错误,在费严格模式下,只指定set,没指定get会抛出underfined.
访问容器的旧方法:_defineGetter_()、_defineSetter_()
Object.defineProperty()第二个参数也可以传入多个属性,并分别对每个属性定义属性,
eg: Object.defineProperty({person,{_year: { writable: true,value:”2001” },name: { writable:false,value:”ccl” }} , set:function(newvalue){}})
3、 原型模式(prototype):eg:Person.prototype.name=””;
1) 可以通过Person.prototype.isPrototypeOf(person1)来测试person1是否指向Person.prototype
2) 在ECMAScript5中,Object.getPrototype(person1) ==Person.prototype,取值的话采用Object.getPrototype(person1).name
3) 删除实例的属性:delete person1.name
4) 检测一个属性是否存在原型中,person1.hasOwnPrototype(“name”);
5) 检测实例中或者原型中是否存在属性:”name” in person1
6) 取得对象上所有可以枚举的实例属性:Object.keys(Person.prototype)或者Object.keys(person1)
7) 原生模型省略了构造函数传递初始化参数这一环节,默默人情况下,都将取得相同的值,解决地话,可以结合构造函数换模式和原型模式。所有的默认原型都是Object实例
8) 原型式的继承可以使用Object.create()或者Object();
eg:var p1 = Object.create(person1); p1.name=”xx”;
9) 寄生组合式继承:inheritPrototype(SubType,SuperType)
第七章
1、 function是关键字,name是指向函数的名字(只适用于FireFox、Safari、Chrom、Opera),function后面没有标识符的话,这时候创建的函数叫做匿名函数(拉姆达函数),匿名函数的name属性是空字符串
functionName.name
2、 函数声明和函数表达式的区别:
函数声明:function fn(){}
函数表达式:var sfn = function(){}
3、 闭包:在一个函数内部创建另一个函数,闭包只能取得包含函数中任何变量的最后一个值
4、 this在闭包下如果要指向函数的话,应该先声明var that = this;在用声明值去调用
5、 块级作用域(私有作用域):
(function(){
//块级作用域
})();
6、 私有变量:函数中定义的变量度可以认为是私有的
特权方法:有权访问私有变量和私有函数的公有方法
7、 模块模式:
1) 单例:只有一个实例的对象
eg:var singleton = {
name:”value”,
method:function(){
//这里是方法的代码
}
}
模式通过为单例添加私有变量和特权方法使其得到加强
eg:
var singleton = function(){ var p = 10; function pFunction(){return false;} //特权、共有方法和属性 return{ publicProperty:true, publicMethod:function(){ p++; return pFunction(); } } }
2) 在匿名函数内部,定义了私有变量和函数,在将对象字面量【单例的接口】作为函数的返回值,在这种模式下,需要对单例进行某些初始化,有需要维护其私有变量:
eg:
var appliaction = function(){ //私有变量和函数 var components = new Array(); //初始化 components.push(new BaseComponents()); //公共 return{ getComponents:function(){return components.length;}, regiestComponents:function(component){ if(typeof component == “object”){ components.push(component); } } } }
3) 增强的模块模式
var singleton = function(){ var p = 10; function pFunction(){return false;} //创建对象 var object = new CustomType(); //特权、共有方法和属性 object.publicProperty = true; publicMethod:function(){ p++; return pFunction(); } return object, }
第八章
1、 全局变量不能通过delete操作符删除,直接在window对象上的定义的属性可以,因为在IE<9的版本在遇到delete会抛出错误
2、 窗口位置:
1) IE、Safari、Opera、Chrome使用:screenLeft和screenTop
2) Firefox、Safari、Chrome使用:screenX和screenY
3) 移动使用:moveTo( , )和moveBy( , )
窗口大小
1) IE9+、Safari、Opera、Chrome、Firefox提供:innerWidth、innerHeight【减去边框宽度】,outerWidth、outerHeight。IE9+、Safari、Firefox的outerWidth、outerHeight返回浏览器本身窗口的尺寸,Opera返回页面视图容器的大小,Chrome中innerWidth、innerHeight,outerWidth、outerHeight返回相同的值
2) 在IE、Safari、Opera、Chrome、Firefox中,document.documentElement.clientWidth和document.documentElement.clientHeigth保存了页面视口的信息,在IE6中,以上标准模式有效,在混杂模式下,采用document.body.clientWidth和document. body.clientHeigth,混杂模式下的Chrome,以上四种都可以。
3) resizeTo(a,b)调整到a*b
resizeBy(c,d)调整到a+c,b+d
3、 window.open()打开一个特定的url或者信息浏览器窗口。里面可传四个参数,要加载的url、窗口目标(可以是一个target框架名或者_self、_blank、_parent、_top)、一个特性字符串(不打开新窗口,忽略这个,打开的话,可设置fullscreen[yes,no,IE]、heigth、width、left、rigth、scrollbar…)、表示新页面是否取代李兰器历史记录当前加载页面的布尔值
var xxx=window.open(…….);
xxx.opener == window
window.close(); ======xxx.closed
浏览器内置的屏蔽程序阻止弹出窗口,window.open()可能为null
4、 超时调用
var time = setTimeout(代码字符串或者函数,1000); clearTimeout(time);
间歇调用:
var time = setInterval(代码字符串或者函数,1000); clearInterval(time);
5、 系统对话框:alert()、confirm()、prompt()
6、 location既是window的对象的属性,也是document的对象的属性
7、 history对象:history.go(-1)—后退、history.go(1)—前进、history.go(2)、history.go(“xxx.com”)
也可以用back()和forward()来代替
第九章
1、 能力监测:用于识别浏览器的能力
if(object.prototypeInQuestion){
}
早期IE5之前使用document.all[id],后来的使用document.getElementById(id)。
2、 怪癖检测:识别浏览器的特殊行为,看存在什么bug
var hasDontEnumQuirk = function(){ var o = (toString:function(){}); for(var prop in o){ if(prop == "toString"){ return false; } } return true; }(); //检测呈现引擎及浏览器 var ua = navigator.userAgent; if ( window.opera ){ engine.ver = window.opera.version(); engine.opera = parseFloat( engine.ver ); } else if ( /AppleWebKit\/(\S+)/.test(ua)){ engine.ver = RegExp["$1"]; engine.webkit = parseFloat(engine.ver); //确定是Chrome 还是 Safari if ( /Chrome\/(\S+)/.test(ua)){ browser.ver = RegExp["$1"]; browser.chrome = parseFloat(browser.ver); } else if ( /Version\/(S+)/test(ua)){ browser.ver = RegExp["$1"]; borwser.safari = parseFloat(browser.ver); } else { //近似的确定版本号 var safariVersion = 1; if (engine.webkit < 100 ){ safariVersion = 1; } else if (engine.webkit < 312){ safariVersoin = 1.2; } else if (engine.webkit < 412){ safariVersion = 1.3; } else { safariVersion = 2; } browser.safari = browser.ver = safariVersion; } } else if ( /KHTML\/(\S+)/.test(ua) || /Konqueror\/([^;]+)/.test(ua)){ engine.ver = RegExp["$1"]; engine.khtml = parseFloat(engine.ver); } else if ( /rv:([^\)]+)\) Gecko\/\d{8}/.test(ua)){ engine.ver = RegExp["$1"]; engine.gecko = parseFloat(engine.ver); //确定不是Firefox if( /Firefox\/(\S+)/.test(ua)){ browser.ver = RegExp["$1"]; browser.firefox = parseFloat(browser.ver); } } else if (/MSIE ([^;]+)/.test(ua)){ engine.ver = browser.ver = RegExp["$1"]; engine.ie = browser.ie = parseFloat(engine.ver); } 针对浏览器 if(client.engine.webkit){ if (client.browser.chrome) { }else if (client.browser.safari){ } } else if (client.engine.gecko) { if (client.browser.firefox) { }else{ } } 检测引擎、浏览器、平台、操作系统 var client = function(){ //呈现引擎 var engine = { ie : 0, gecko : 0, webkit : 0, khtml : 0, opera : 0, //具体的版本号 ver : null }; var browser = { //浏览器 ie : 0, firefox : 0, konq : 0, opera : 0, chrome : 0, safari : 0, //具体的版本 ver : null }; var system = { win : false, mac : false, xll : false }; //再次检测呈现引擎、平台和设备 return { engine : engine, browser : browser, system : system }; }(); //navigator.platform值Win32 、Win64、MacPPC、MacIntel、X11、Linux i686 var p = navigator.platform; system.win = p.indexOf("Win") == 0; systemp.mac = p.indexOf("Mac") == 0; system.xll = (p.indexOf("Xll")) == 1 || (p.indexOf("Linux") == 0);
未完待续。。。