js中对象的创建以及继承的实现

学习js一段时间以来,在网上没有找到比较系统的关于js面向对象方面的文章,故有感而发写此博文,供大家分享。注:本文章很大部分参考的张龙老师的资料,在此先感谢他,我只是做个总结而已。

一对象的创建

1.基于已有对象的扩充

       var object = new Object();
	object.name = "jason";
	object.fn = function()
	{
		alert(this.name);
	}

这种方式最不推荐了,除非临时需要用到对象,因为它根本失去了面向对象的特性。

2工厂方式

       function createObject(name,age)//工厂方法,用于创建对象
	{
		var obj = new Object();
		
		obj.name = name;
		obj.age =age;
		obj.fn = function()
		{
			alert("name="+this.name+"; age="+this.age);
		}
		
		return obj;
	}
	
	var obj1 = createObject("jason",21);
	var obj2 = createObject("jack",20);
	
	obj1.fn();
	obj2.fn();

这种方式应用工厂方法的设计模式创建对象,但是有两大不足之处:(1)每个工厂方法所创建的对象都会拥有一份自己的fn方法,而这个方法的代码是重复的,因而比较占用内存引起资源浪费;(2)创建对象的方式其实就调用方法而已,未用new关键字来创建,熟悉java、C++面向对象的朋友们都会感觉别扭。因此也不推荐使用.

3.原形方式

      function Person()
	{
		
	}
	Person.prototype.name = new Array("jason");
	Person.prototype.age = 21;
	Person.prototype.fn= function()
	{
		alert("name= "+this.name+" ;age="+this.age);
	}
	
	var p1 = new Person();
	var p2 = new Person();
	
	p2.name.push("jack"); //用原形方式其实所有对象共享的属性的,所有对 //象的name属性指向同一份数组对象了,因此对p2name属性的修改会影响的p1 的name属性的
	
	p1.fn();
	p2.fn();

运行结果如下: js中对象的创建以及继承的实现,两个结果都是一样的,说明这两个对象是也共享了name属性的,这是我们不需要的,我们只需不同对象共享方法而已,并且带来了很大的麻烦。并且这种方式和第一种方式比较类似,同样采取扩展方式,没有了面向对象中“类”的那种模版作用了,坚决不推荐。

4.构造函数+原形的方式

      function Person(name,age)
	{
		this.name = name;
		this.age = age;
		
		if(typeof Person.isFirst == "undefined")
		{
			Person.prototype.fn = function()//为Person的原形添加fn属性(函数可以作为对象的属性的)
			{
				     alert("name="+this.name+";age="+this.age);
			}
		}
		
		Person.isFirst = true;//创建了一个对象后将其设为true,就   //不会执行上面的if语句,从而保证所有对象共享一份fn方法代码
	}
	
	var p1 = new Person("jason",21);
	var p2 = new Person("jack",20);
	
	p1.fn();
	p2.fn();

这种方式通过一个标准变量isFirst 来判断是不是用该“类”创建的第一个对象,从而保证了所有对象共享一份方法代码,用new关键字来创建对象令人如见故友

二继承

1.对象冒充、2.call()和apply()方式、3.原形链方式

       function Parent(name)
	{
		this.name = name;
		this.sayName =function()
			{
				alert("hi my name is "+name);
			};
		
	}
	
	function Child(name,age)
	{
		this.parent = Parent;//这三条语句是用的对象冒充实现继承的
		this.parent(name);//
		delete this.parent;//
               // Father.call(this,name);//用call方法实现继承,可以替代上面的三句
                // Father.cpply(this,[name]);//用apply方法实现继承,可以替代最上面的上面的三句                 // Child.prototype = new Fahter();//用原形链方法实现继承,可以替代最上面的上面的三句,不过这里的name要另外赋值了
 		
		this.age = age;
		
		this.sayAge=function()
			{
				
				alert("hi my name is "+name+" and my  age is "+age);
			};
		
	}
	
	var p = new Parent("father");
        var c = new Child("son",18);
		
		p.sayName();//father
		c.sayName();//son
                c.sayAage();//18
		


你可能感兴趣的:(js中对象的创建以及继承)