浏览 2551 次
锁定老帖子 主题:JAVASCRIPT定义对象的四种方式
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-25
最后修改:2010-05-13
function showSalary(){ alert(this.salary); } 工厂方式 先创建对象,然后添加属性和方法,不需要用NEW创建对象, 如果把函数写在内部,每次调用都会创建新的函数,放在外面,封装性不好 function createWorker(sAage,sSalary,sDepartment){ var oWorker=new Object(); oWorker.age=sAage; oWorker.salary=sSalary; oWorker.department=sDepartment; //创建函数的方式一,指向我们文章开头写好的函数名,缺点是函数在对象的外部,封装性不好 oWorker.tellSalary=showSalary; //创建函数的方式二,在对象内部声明匿名函数,虽然封装在对象内部了,但没个对象会有不同的函数版本,浪费内存 oWorker.tellSalary=function(){ alert(this.salary); } return oWorker; } var worker1=createWorker(24,1000,"Dev"); worker1.tellSalary(); var worker2=createWorker(24,3000,"Dev"); worker2.tellSalary(); 构造函数方式 在构造函数内部不创建对象,使用this关键字,创建时候用new操作符,如果把函数声明在内部,存在和工厂方式相同的问题,重复创建函数。为每个对象都创建独立的函数版本。放在外部,封装性不好 function Worker(sAage,sSalary,sDepartment){ this.age=sAage; this.salary=sSalary; this.department=sDepartment; //同工厂方式 this.tellSalary=showSalary; //同工厂方式 this.tellSalary=function(){ alert(this.salary); } } var worker3=new Worker(24,1000,"Dev"); worker3.tellSalary(); var worker4=new Worker(24,3000,"Dev"); worker4.tellSalary(); 原型方式,创建对象时不能使用构造传递参数,必须先创建对象,然后改变属性的值 function Worker(){ } Worker.prototype.age=24; Worker.prototype.salary=1000; Worker.prototype.department="Dev"; Worker.prototype.homeaddress=new Array("www","dd"); // 创建多个对象时,要想一想此处为什么不会和构造函数方式及工厂方式一样,创建多个函数的实例 //要理解prototype的概念,prototype是父对象的一个实例 Worker.prototype.tellSalary=function(){ alert(this.age); } var worker5=new Worker(); var worker6=new Worker(); worker5.tellSalary(); alert(worker5.homeaddress) //修改原型中引用类型的值,会影响到所有已经实例化的对象 worker6.homeaddress.push("gg") alert(worker5.homeaddress) 混合原型和构造函数方式 可以传递参数构造对象,多个实例对象共享一个函数 function Worker(sAage,sSalary,sDepartment){ this.age=sAage; this.salary=sSalary; this.department=sDepartment; this.homeaddress=new Array("www","dd"); } //只创建tellSalary函数一个实例,没有内存浪费 Worker.prototype.tellSalary=function(){ alert(this.age); } var worker7=new Worker(23,3000,"Dev"); var worker8=new Worker(43,1000,"Dev"); worker7.tellSalary(); alert(worker7.homeaddress) // ww dd worker8.homeaddress.push("gg") alert(worker7.homeaddress) //www dd alert(worker8.homeaddress) // www dd gg 第四种的方式看上去也很散落,可以改进一下 var person=function(sname,sage){ this.name=sname; this.age=sage; }; person.prototype={ tellName:function(){ alert(this.name); }, tellAge:function(){ alert(this.age); } }; 优点: 1. 可以传参数构造一个新对象 2. 当有多个对象产生时,不会创建多个函数实体,没有内存浪费 3. 封装想很好,属性和方法分开, 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |