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关键字节约内存。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号