8-28 程宗武
day18(JavaScript)
一、函数
JavaScript解决函数的重载问题:arguments,arguments是类数组对象,根据传入的不同参数,输出不同的结果。
function test1(names){
switch(arguments.length){
case 1:
console.log("朱朝阳的暑假");
case 2:
console.log("张东升的奥数班");
}
console.log(arguments); -->[Arguments] { '0': '朱朝阳', '1': '张东升' }
}
test1('朱朝阳','张东升'); -->张东升的奥数班
类数组对象 vs 数组
相同点:
1、都有下标
2、都能调用.length方法求出数组的长度
3、都能遍历
不同点:
类数组对象是Object类型,数组是Array类型类数组对象不能调用数组的对应的方法。
1、闭包
- 找受保护的的变量,确定外层函数调用后,受保护变量的最终
- 找操作受保护的变量的内层函数对象
var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add(); // counter=1;
add(); // counter=2;
add(); // counter=3;
上述语句的执行过程
1、匿名函数的自调用,初始化了变量counter,并将匿名函数整体结构返回给了add 此时add就相当于 add --> function () {return counter += 1;}
2、当执行add()函数的时候,实际上执行的是返回的匿名函数执行过后返回的结果,
而且此时匿名函数内部的counter和外部的counter存在指向关系,因此执行完毕的匿名函数并不会销毁变量counter。
3、当再次执行add()后,里面的counter还是上一次执行完毕的值。
二、对象
1、内置对象
2、自定义对象
1)使用内置构造函数创建对象
var obj = new Object();//创建一个空的内置对象
obj.name = "朱朝阳"; 添加属性
obj.age = 10;
2)使用自定义构造函数创建对象
function person(name,age){
this.name = name;
this.age = age;
this.sayHello=function(){
console.log(this.name);
}
}
var person1=new Person("lili",24,"teacher")
var person2=new Person("leilei",20,"student")
person1.sayHello()
person2.sayHello()
console.log(person1.sayHello == person2.sayHello) -- false
缺点:每个方法都要在每个实例上重新创建一遍。只有调用sayHello时才会给person实例创建一个新的sayHello对象,并将其作为属性添加到person实例中
3)工厂模式
function Person(name,age,job){
var obj=new Object();
obj.name=name;
obj.age=age;
obj.job=job;
obj.sayName=function(){
console.log(this.name)
return obj;
}
}
var person1=new Person('ll','22')
var person2=new Person('ss','33')
person1.sayName()
person2.sayName()
console.log(person1.sayName()==person2.sayName()) -->true
使用这种方法虽然可以解决function的不断创建,但是无法知道这个实例具体是由那个对象创建的。也就是实例与实例之间的关系很模糊。
点赞
评论