概述
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关键字节约内存。