JavaScript -- 面向对象

概述

  JavaScript本身并非面向对象(不支持“class”关键字),只能通过其本身的一些特性来模拟面向对象编程。

  主要分为两大类:

    1,原始对象方式;

    2,构造函数方式(推荐)。

 

原始对象方式

  直接使用json:

		var Dog = {
			name : '';
			color : ''
		};

		var dog1 = {};
		dog1.name = "dog1";
		dog1.color = "yellow";

		var dog2 = {};
		dog2.name = "dog2";
		dog2.color = "blue";

  这类方式有2个缺点:1,原型与实例对象之间关系不明显(dog1与dog2很难看出是Dog的实例);2,语法非常啰嗦。

 

  为了解决语法啰嗦的问题,可以使用以下方式:

		function Dog(name, color) {
			return {
				name : name,
				color : color
			}
		}

		var dog1 = Dog("dog1", 'yellow');
		var dog2 = Dog("dog2", "blue");

  此类方式仍旧存在缺点1。

 

构造函数方式

  原型对象方式存在以上的问题,JavaScript提供构造器方式。

  构造器:形式上仍是一个function,但其内部含有this关键字,可以使用new 关键字调用构造器生成实例。

 

  使用构造器修改之前的代码:

		function Dog(name, color) {
			this.name = name;
			this.color = color;
		}
		Dog.prototype.eat = function (){
			alert("eat something");
		};
		Dog.prototype.type = "dog";

		var dog1 = new Dog("dog1", "yellow");
		var dog2 = new Dog("dog2", "blue");

 

  这里要说明的是prototype关键字,以上代码中

		Dog.prototype.eat = function (){
			alert("eat something");
		};
		Dog.prototype.type = "dog";

  

  可以使用this关键字代替:

    this.type = "dog";

    this.eat = function(){alert(“eat something");};

  

    但是this关键字方式存在一个问题:每个实例都会重新生成type及eat,但我们看到,对于type及eat每个实例的内容都是一样的,所以这样就造成了内存的浪费。

  有没有方式可以解决这个问题呢?有,那就是使用prototype关键字。

 

    prototype关键字:每个构造器都可以使用prototype,它指向另一个对象,此对象的属性和方法会被该构造器的实例继承。

 

  总结:
     1,原型对象方式可能存在”原型与实例对象之间关系不明显“、”语法啰嗦“的问题;

   2,构造器方式是推荐的方式,使用this关键字声明属性和方法,new关键字生成实例化对象;

   3,若构造器方式中含有一致的方法或属性,可以使用prototype关键字节约内存。

 

  

 

 

posted @ 2013-10-29 10:44  Alex_Monkey  阅读(286)  评论(0编辑  收藏  举报