发表于: 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()的变量也会保存在内存中,不会被销毁。
评论