javascript虽然是弱类型语言,但是本质上也可以作为面向对象语言使用。
下面总结一下四种创建对象的方法。
1.直接实例化Object对象
var user = new Object()
实例化后的user作为对象可以添加属性及方法。
user.name = "defualt";
user.getName = functoin(){ return this.name};
user.setName = function(_name){ this.name = _name};
这样就可以使用user对象的属性及方法了。
alert(user.name);
user.setName("Tom");
alert(user.setName());
2.使用JSON
实际上javascript中的对象就是一个Array。
比如被实例化了的user对象,可以使用以下方式进行调用。
alert(user["name"]);
alert(user["getName"]());
而JSON就是以Array的形式定义对象
var user = {
name : "default",
setName : function(_name) { this.name = _name;},
getName : function(){ return this.name; }
}
调用方式和上面一致,不再记述。
3.类的定义
以上两种方式都直接使用了对象,但复用性不好,如果想重新使用,需要重新编写代码。
如果引入类的概念,则会有更好的代码复用性。
不过实际上javascript是没有类的概念的,但是function可以当作类来使用。
fuction User(){
this.name = "default";
this.setName = function(_name) { this.name = _name; }
this.getName = function() { return this.name; }
}
//类的实例化及调用
var user = new User();
alert(user.name);
user.setName("Tom");
alsert(user.getName());
4.原型方式
类是有了,代码也可以复用了,但有出现了一个性能问题。
如果以上面的形式创建多个User对象,则每个User对象都会有一个name副本,一个setName副本,一个getName副本,
如果存在N个User对象,则会浪费很大一块内存。
属性可以为私用即每个对象可以handle一个副本,但是方法完全可以多个对象共享一个(多亏this关键字)。
javascript中的prototype成为了解决这个问题的关键。
prototype是javascript中的重要概念,也是现有编程语言里唯一一个有此定义的语言。
著名的prototype库就是利用了此属性对javascript进行了扩展。
当然用它来定义对象也是可以的。
function User() { this.name = "default"; }
function setName(_name) { this.name =_name; }
function getName() { return _name; }
User.prototype.setName = setName;
User.prototype.getName = getName;
//类的实例化及调用
var user = new User();
alert(user.name);
user.setName("Tom");
alsert(user.getName());
总结一下这四种创建对象的方法。
第一种只是概念性引入,不建议在实际代码中使用。
第二种JSON方式,建议在对性爱那个层级关系嵌套层次较多或需要动态方式定义对象的场景下使用,
如果需要和服务器端进行对象的互传,那么JSON也是一个好的解决方案。
第三种类的定义,如果场景是需要定义一个只需要实例化一次的对象,那么这是一个不错的选择。
第四种prototype方式,如果需要构建一个复杂的类,或者需要重复实例化多个对象,那么这是请选用这种方式。