标签:基本数据类型 获取 无法 创建 条件 enum 子类 foo 字符串
闭包:函数就是一个闭包,一个封闭的作用域;
/*window的name属性*/function fn(){        console.log(this.name);}    fn.call({name:"zhangsan"});//"zhangsan"    console.log();    fn();//‘‘ 打印空字符串,此时调用fn其中的的this指的是window对象,//window对象具有name属性,值是一个空字符串//函数的四种调用模式//上下文模式 call  apply   借用的概念function foo(){}//当foo函数声明好了后无法确定foo函数的身份,只有在调用的时候//才能确定foo的所属;根据foo函数的执行情况和返回结果//js中函数由四种不同的调用方式,其中this的指向,返回值由return决定(构造函数特殊)//1.函数调用模式    foo();//本质就是使用window对象,调用;指向window//2.方法调用模式,把函数当做对象的方法;this指向objvar obj ={        fn:function(){}};    obj.fn();    obj[‘fn‘]();//3构造函数调用 将函数当成构造函数来调用(new);this指向构造函数的实例functionFoot(){}newFoot();//构造函数没有return语句,返回的是构造函数的实例//有return,return的内容是一个对象,返回值是return语句的对象;如果return的是基本数据类型,那返回值//还是实例functionFoot2(){return[1,2,3];}var foot2=newFoot2();    console.log(foot2.__proto__);//Array.prototype  ?Array[0]//4.上下文调用模式,根据用户传递的参数产生不同的结果 .this的值由调用者决定;//call/apply 这两个方法都是定义在Function.prototype中的方法,这样任何函数都能访问到这两个方法//调用模式,只有函数才能调用function fn(){        console.log(this.name);}    console.log(fn.call()===Function.prototype.call());//true    fn.call({name:"zhangsan"});//zhangsan//call方法的第一个参数指的是本次调用该函数内部this的值    fn();//此时this指向window  window有一个name属性是"" 空字符串.function foo(){     console.log(this.name);return[1,2,3];} foo();//""var f1=foo.call({name:"张三"});//"张三" console.log(f1.__proto__);//上下文模式return返回值由return决定,返回值是一个数组对象 //Array.prototypevar f2=new foo();//undefined console.log(f2.__proto__);//Array.prototype/*call方法*/    /*以下方法使用apply使用时相同的*/
function foo(){        console.log(this.age);}var obj={age:18};    foo.call(obj);//18  其中的this指的是obj    foo.call(null);//foo函数中的this指向window//call方法的第一个参数还可以是数字,字符串,布尔值这些基本的数据类型    foo.call(3);//number   数字3转化为对应的基本包装类型Number类型/*call方法*/function foo(){        console.log(this.age);}var obj ={age:18};    foo.call(obj);//18  其中的this指的是obj    foo.call(null);//foo函数中的this指向window//call方法的第一个参数还可以是数字,字符串,布尔值这些基本的数据类型    foo.call(3);//number   数字3转化为对应的基本包装类型Number类型/*call有实参的情况*/function fn(){//传递的参数在函数内部使用arguments获取for(var i =0; i < arguments.length; i++){            console.log(arguments[i]);}}//使用call方法来调用fn函数的时候,如果需要传递实参,将实参作为call方法的第二个参数开始依次传递    fn.call(null,1,2,3,4)/*apply有实参的情况*/function fun(){for(var i=0;i<arguments.length;i++){            console.log(arguments[i]);}}//使用apply方法来调用fun函数的时候,第二个参数是一个数组对象    fun.apply(null,[1,3,5]);//第一个参数:函数内部this的值//[实参1,实参2,实参3]//    call/aply的异同点//相同点:他们都是Function.prototype对象中定义的方法//第一个参数都表示函数内部的this的值//不同点:在传参的时候,如果给函数传参的时候利用call方法,// apply传递的是数组.call传递的是用逗号分隔的一个一个的参数/*上下文模式借用内置方法*///数组里面的push方法实现的功能,向数组里面添加一个元素//1.借用push方法,向伪数组中添加元素;[].push  Array.prototype//伪数组是没有push方法的,首先我们要能访问到push方法var arr={1:10,2:28};[].push.call(arr,10,20,30);    console.log(arr);//jQuery对象也是伪数组//向数组中添加元素的方法//push//arr[arr.length]//2.借用数组的push方法向数组中添加元素var arr1 =[];var arr2=[10,120,10,20];//需求 将arr2中的元素添加到arr1中[].push.apply(arr1,arr2);//apply方法for(var i=0;i<arr2.length;i++){//之前的方法           arr1.push(arr2[i]);}//数组的方法经常被伪数组所借用//1.需求 将一个伪数组转化为真数组:slicevar  arr=[13,12,12,34];    arr.slice(1);//从索引1开始截取,到最后一个元素[12,12,34]var obj ={0:"范明",1:"小沈阳",length:2};[].slice.call(obj);//返回的是一个数组["范明","小沈阳"];[].slice.call(obj,1);//返回的是一个数组["小沈阳"];//2.删除伪数组里面的元素var obj2 ={0:"范明",1:"小沈阳",2:"沈阳",length:2};//删除数组中的第第三个元素,参数从第几个开始删,删除几个var newObj=[].splice.call(obj2,1,1);    console.log(newObj);//["小沈阳"]    console.log(obj2);//Object {0: "范明", 2: "沈阳", length: 1}[].splice.call(obj2,2,1,200,300);//从第三个参数开始是添加的元素//3.借用构造函数实现继承functionPerson(name,age){//父类构造函数this.name=name;this.age=age;}//    function Student(name,age,number){//        this.age=age;//        this.name=name;//        this.number=number;//    }//优化functionStudent(age,name,number){//子类构造函数Person.call(this,name,age);//给构造函数的实例,添加name,age两个属性//this代表Student的实例//Student构造函数借用Person构造函数this.number=number;}var stu =newStudent(18,"zhangsan",12);    console.log(stu);//注意条件:父类构造函属性要对子类对象通用/*jQuery大结构原理 init*/   function jQuery(){//init是一个构造函数,用于创建jQuery对象,并返回这个对象returnnew jQuery.prototype.init();}    jQuery.prototype={        constructor:jQuery,        init:function(){returnthis;},        css:function(){}};//init的原型指向jQuery的原型,这样init创建的对象就可以使用jQuery原型中的方法了    jQuery.prototype.init.prototype=jQuery.prototype;标签:基本数据类型 获取 无法 创建 条件 enum 子类 foo 字符串
原文地址:http://www.cnblogs.com/itlyh/p/6012095.html