开学第二天,继学习感悟1开始写学习感悟2
1.今天主要学习了面向对象的编程,Ecmascript主要包括两种属性,1是数据属性,2是访问器属性,其中数据属性有4个描述其行为的特性(configurable、enumerable、writable、value)访问器属性同样也包括4个属性(configurable、enumerable、get、set)
2.面型对象有很多设计模式
(1)工厂模式
function creatPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayname = function(){
alert(this.name);
};
return o;
}
var p1 = creatPerson("sun",21,"software engineer");
var p2 = creatPerson("che",23,"software engineer");
工厂模式虽然解决了多个相似对象的问题,但是却没有解决对象识别的问题(即怎样知道一个对象的类型),这时候出现了构造函数模型
(2)构造函数模式
function creatPerson(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayname = function(){
alert(this.name);
};
}
var p1 = creatPerson("sun",21,"software engineer");
var p2 = creatPerson("che",23,"software engineer");
构造函数毕竟也是普通函数,可以当做函数来使用,构造函数虽然好用,但是每个方法都要在每个实例上重新创建一遍,在前面的例子中,p1和p2都有一个sayname()方法,但是两个方法不是同一个function实例,,虽然可以将方法定义为全局函数,但是定义多了全局函数多了就没有丝毫封装性可言,于是就引入了原型模式
(3)原型模式
function person(){
}
person.prototype={
name:"sun",
age:21,
job:"software engineer",
sayname:function(){
alert(this.name);
}
};
var p1 = new person();
p1.sayname();//sun
var p2 = new person();
p2.sayname();//sun
alert(p1.sayname == p2.sayname);//true
实例一定要在原型之后创建,重写原型对象切断了现有原型与之前已经存在的对象实例之间的联系,原型对象最大的问题是由其共享问题导致的
原型中有一个数组,实例v1向其push一个字符串,v2实例也会含有这个字符串,这正是很少有人单独使用原型模式的原因,最热门的的组合使用 构造函数模式 + 原型模式
function person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["che","xi","sao","kang"];
}
person.prototype={
constructor : person,
sayname:function(){
alert(this.name);
}
};
var p1 = new person("sun",21,"ssoftware engineer");
var p2 = new person("pang",21,"girlfriend");
p1.friends.push("pang");
alert(p1.friends);
alert(p2.friends);
alert(p1.friends == p2.friends);//false
alert(p1.sayname == p2.sayname);//true
3.匿名函数要必须定义在调用之前函数声明则并不需要,因为函数声明提升
function f(num){
if(num <=1){
return 1;
} else {
return num*arguements.callee(num-1);//减少耦合性
}
}
4.重点理解
;(function(){
//这里是块级作用域
})();
将函数声明转换为函数表达式只需要加个括号就ok