开学次日,继学习感悟1开始写学习感悟2html
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实例,,虽然能够将方法定义为全局函数,可是定义多了全局函数多了就没有丝毫封装性可言,因而就引入了原型模式this
(3)原型模式prototype
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实例也会含有这个字符串,这正是不多有人单独使用原型模式的缘由,最热门的的组合使用 构造函数模式 + 原型模式htm
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