发表于: 2017-05-06 23:24:37

1 1024


今天完成的事情:

学习面向程序设计的思想

理解函数表达式


明天计划的事:

学习使用正则表达式

继续task2


遇到的问题:


收获:

1,对象创建的模式主要有

a,Object构造函数

var person=new Object();
person.name="bob";
person.age=18;
person.sayname=function(){
   alert(this.name);
};

最标准的构造方法。

b,对象字面量

var person={
   name:"bob",
age:18,
sayname:function{
       alert(this.name);
   }
};

具有更好的封装性。


c,工厂模式

function creatPerson(name,age,sayname){
   var person=new Object();
   person.name=name;
   person.age=age;
   person.sayname=function(){
       alert(this.name);
   };
   return person;
}

可以创建多个具有相同属性的对象。无法识别对象类型。

d,自定义构造函数

function Person(name,age,sayname){
   this.name=name;
   this.age=age;
   this.sayname=function(){
       alert(this.name);
   };
}

构造函数的函数名一般需大写,函数的方法不会在实例间共享。


e,原型模式

function Person(){
}
Person.prototype.name="bob";
Person.prototype.age=18;
Person.prototype.sayname=function(){
   alert(this.name);
};

会使函数的所有属性值在实例间共享。


f,组合使用原型模式和构造函数

function Person(name,age,sayname){
   this.name=name;
   this.age=age;
}

Person.prototype={
   constructor:Person,
sayname:function(){
       alert(this.name);
   }
}

可自由选择需要共享的属性值。

g,动态原型

function Person(name,age,sayname){
   this.name=name;
   this.age=age;
   if(typeof this.sayname != "function"){
       Person.prototype.sayname=function(){
           alert(this.name);
       };
   }
}

更像传统的面向对象编程,封装性更好。


2,函数
a,如下的函数:

function a(){
   alert("nihao");
}

a为函数名,是一个指向函数实例的指针,a()是函数体,在本例中等于alert("nihao");

b,由于函数声明有提升效果,因此不能将函数声明写在代码块中:

if(x>y){
   function a(){
       alert("x is bigger!");
   }
}else{
   function b(){
       alert("x is not bigger");
   }
}

a()和b()都被提升,两者不存在执行的先后顺序,因此代码块会报错。


c,递归,即函数内部调用自身。

可通过将内部递归函数名设置为arguments.callee指向正在执行的函数来更好的完成递归调用。


d,闭包

函数内部是局部作用域,在js的作用域链中,作用域链为向外延伸,不可向内延伸。即内部作用域可访问外部作用域,外部作用域无法访问内部作用域。闭包就是为了延伸向内的作用域链。

闭包通过在函数内部再创造一个内部作用域,即函数,然后返回内部函数来实现。

function f1(){
   var n=999;
   function f2(){
       alert(n);
   }
   return f2;
}

有三个作用域 window,f1(),f2(),通过返回f2到window,获得f2内部的f1的变量信息,window即可访问f1的变量,这就构建了闭包。

由于三个作用域的依赖关系,由于window始终保存在内存中,故f1(),f2()的变量也会保存在内存中,不会被销毁。


返回列表 返回列表
评论

    分享到