JavaScript创建对象4种方法详解及方法优缺点

时间: 作者:admin 浏览:
1、工厂模式
<script type="text/javascript">
	function Person(name,age,height){
		var Obj=new Object();
		Obj.name=name;
		Obj.age=age;
		Obj.height=height;
		Obj.sayName=function(){
			alert("我的名字是:"+Obj.name);
		}
                Obj.run=function(){
			alert("我会跑");
		}
		Obj.fly=function(){
			alert("我会飞");
		}
		......
		//可以写无数个,单一的要一个加一个,但是没有区分不同对象实例的不同属性和方法,其实就是普通函数里面包了一个Object,要加什么不断往下堆积

                return Obj;
	}
        var person=Person("小明",18,175);//
	person.sayName();//我的名字是小明,其他方法调用类似;
</script>

弊端:虽然其解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即如何得知一个对象的类型);

2、构造函数模式
<script type="text/javascript">
       function(name,age,height){
		this.name=name;
		this.age=age;
		this.height=height;
		this.sayName=function(){
			alert("我的名字是:"+Obj.name);
		}
		this.run=function(){
			alert("我会跑");
		}
		this.fly=function(){
			alert("我会飞");
		}
		......
                //可以写无数个,依然没有区分不同对象实例的不同属性和方法,只是将所有属性方法交给了this,不用显式创建Object对象,
	}
        var person=new Person("小明",18,175);

</script>


与工厂模式相比:
1、没有显式的创建对象
2、直接将属性和方法赋给了this对象
3、没有return语句
要创建Person的实例,必须使用new操作符,以这种方式调用构造函数实际上会经历4个步骤:
1、创建一个新对象
2、将构造函数的作用域赋给新对象
3、执行构造函数中的代码
4、返回新对象

缺点:
1. 每一次实例化,该对象内部函数都会被创建一遍。
2. 对象继承并需要在子类中调用父类的方法是不可能的,只可以覆盖或者使用。

优点: 每个实例的公共对象都是不同的,不会相互影响。

3、原型模式
<script type="text/javascript">
        function Person(){
		
	}
	Person.prototype.name="小明";
	Person.prototype.age=18;
	Person.prototype.height=175;
	Person.prototype.sayName=function(){
		alert("我的名字是:"+this.name);
	};
	Person.prototype.run=function(){
		alert("我会跑");
	};
	Person.prototype.sayName=function(){
		alert("我会飞");
	};
	......//在写法上面感觉还不如工厂模式,但是在用法上面很有优势,但是依然不能区分不同对象实例的不同属性和方法;
	var person=new Person();
	person.sayName();

</script>
优点:
1. 减少内存消耗,系统资源占用少,所有实例共享同一方法,不会创建多个
2. 原型对象继承时,子类在重写父类原型方法时很方便 ,可以很方便 调父类房法,再扩展。
缺点:
1. 优点1既是最大的优点,也同样带来一个严重问题,如果共享的对象是引用 对象(如array)则也会造成多个实例共享同一个array,很可能会相互影响

4、组合使用构造模式和原型模式(最优)
<script type="text/javascript">
	function Person(name,age,height){
		this.name=name;
		this.age=age;
		this.height=height;
	}
	Person.prototype={
		constructor:Person,
		sayName:function(){
			alert("我的名字是"+this.name);
		}
	}
	Person.prototype.run=function(){
		alert("我会跑");
	}
	Person.prototype.fly=function(){
		alert("我会飞");
	}
	.......
	var person1=new Person("小明",18,175);
	var person2=new Person("小红",20,170);
	console.log(person1.name);//小明
	console.log(person2.name);//小红
</script>
创建自定义类型的最常用的方式,就是组合使用构造函数模式与原型模式。构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性,这样每个实例都有自己的一份实例属性的副本,又同时共享着对方法的引用,最大限度的节省了内存。

优点如下:
①每个实例都会有自己的一份实例属性的副本,又同时共享对方法的引用,最大限度地节省了内存。
②这种混合模式还支持向构造函数传递参数。

这种方式创建对象,是目前使用最广泛,认同度最高的一种方式。甚至可以书是一种默认的模式。
微信公众号
微信公众号:
  • 前端全栈之路(微信群)
前端QQ交流群
前端QQ交流群:
  • 794324979
  • 734802480(已满)

更多文章

栏目文章


Copyright © 2014-2023 seozhijia.net 版权所有-粤ICP备13087626号-4