javascript对象的几种创建方式分析
1.基于字面量JSON方式创建对象
1.1 创建对象并初始化
//缺点:无法通过构造函数来传值,没有类的约束,无法实现对象的重复利用
1 var Person = {
2 name:"jack",
3 age:19,
4 say:function(){
5 alert(this.name + "," + this.age);
6 }
7 };
8 Person.say();
1.2 创建对象后动态初始化对象
1 var Person = {};
2 Person.name = "jack";
3 Person.age = 19;
4 Person.say = function(){
5 alert(this.name + "," + this.age);
6 };
7 Person.say();
2.基于new的方式
//缺点:没有类的约束,无法实现对象的重复利用
1 var Person = new Object();
2 Person.name = "jack";
3 Person.age = 19;
4 Person.say = function(){
5 alert(this.name + "," + this.age);
6 };
7 Person.say();
3.基于工厂的方式
//通过工厂函数进行传值,在函数内创建对象,这样根据不同的参数,创建不同的对象,实现类的模式。
//缺点:可以解决重复利用的问题,但是无法获取对象的类型,如p1和p2都是Object类型通过typeof p1和p2 只能返回object
1 function createPerson(name,age){
2 var p = new Object();
3 p.name = name;
4 p.age = age;
5 p.say = function(){
6 alert(this.name + "," + this.age);
7 };
8 return p;
9 }
10 var p1 = createPerson("jack",19);
11 p1.say();
12 var p2 = createPerson("lucy",29);
13 p2.say();
4.基于构造方法的方式
4.1 在构造方法内部直接定义成员
//与工厂方式区别是函数名称就是类的名称,函数内部通过this来完成属性的定义
//缺点:函数say在内部定义,每次new一个对象都会拷贝一份,占用空间。
1 function Person(name,age){
2 this.name = name;
3 this.age = age;
4 this.say = function(){
5 alert(this.name + "," + this.age);
6 };
7 }
8 var p1 = new Person("jack",19);
9 p1.say();
10 var p2 = new Person("lucy",20);
11 p2.say();
4.2 在外部定义say方法,内部只做方法的引用
//可以解决函数每次new就被拷贝的问题
//缺点:方法定义成全局,会被window对象所调用,破坏了对象的封装性,如果类中有大量方法,那么就有大量全局函数,不利于开发
1 function Person(name,age){
2 this.name = name;
3 this.age = age;
4 this.say = say;
5 }
6 function say(){
7 alert(this.name + "," + this.age);
8 };
9 var p1 = new Person("jack",19);
10 p1.say();
11 var p2 = new Person("lucy",20);
12 p2.say();
5.基于原型的创建方式
5.1 在方法内部定义原型
//方法new后只有一份在原型中
//缺点:1)如果属性多编写麻烦
1 function Person(name,age){
2 Person.prototype.name = name;
3 Person.prototype.age = age;
4 Person.prototype.say = function(){
5 alert(this.name+","+this.age);
6 };
7 };
8 var p1 = new Person("jack",19);
9 p1.say();
10 var p2 = new Person("lucy",20);
11 p2.say();
5.2 在外部动态定义原型
//缺点:属性多编写麻烦
1 function Person(){};
2 Person.prototype.name = "jack";
3 Person.prototype.age = 19;
4 Person.prototype.say = function(){
5 alert(this.name+","+this.age);
6 };
7 var p1 = new Person();
8 p1.say();
9 var p2 = new Person();
10 p2.name = "lucy";//在p2空间中创建name
11 p2.say();
5.3 重写原型的方式
//缺点:1)无法用构造函数设置值 2)会重写原型 3)当原型属性中有引用类型,会造成变量名重名
1 function Person(){
2
3 };
4 Person.prototype = {
5 constructor:Person,//将constructor指向Person
6 name:"jack",
7 age:19,
8 friends:["lili","lala"],
9 say:function(){
10 alert(this.name+","+this.age + ",friends: " + this.friends);
11 }
12 };
13 var p1 = new Person();
14 p1.friends.push("jammy");//这个时候原型中的friends数组被改变,会影响其它对象
15 p1.say();
16 var p2 = new Person();
17 p2.name = "lucy";
18 p2.say();
5.4 组合方式(构造方法和原型),常用的最佳方式
//属性通过构造方法,函数通过原型创建
1 function Person(name,age){
2 this.name = name;
3 this.age = age;
4 }
5 Person.prototype = {
6 constructor:Person,
7 say:function(){
8 alert(this.name+","+this.age);
9 }
10 };
11 var p1 = new Person("jack",19);
12 p1.say();
13 var p2 = new Person("lucy",20);
14 p2.say();
6. 类java方式
1 function Person(name,age){
2 this.name = name;
3 this.age = age;
4 if(!Person.prototype.say){
5 Person.prototype.say = function(){
6 alert(this.name+","+this.age);
7 }
8 }
9
10 }
11 var p1 = new Person("jack",19);
12 p1.say();
13 var p2 = new Person("lucy",29);
14 p2.say();
转载请注明地址:http://www.cnblogs.com/goodpan/p/4676174.html