/* *在js中并不存在类,所以可以直接通过Object来创建对象,但是使用这种方式创建有一 *弊端:由于没有类的约束,无法实现对象的重复利用,并且没有一种规范约定,在操作时容易带来问题。 */ var person = new Object(); person.name = "lyf"; person.age = 23; person.say = function(){ alert(this.name+","+this.age); } json:json就是js的对象,但是它省去了XML标签,而是通过{}来完成对象的说明。 var person = { name:"张三", age:25, say:function(){ alert(this.name+","+this.age); } } //通过json依然可以创建对象数组,创建方式和js的数组一样。 var ps = [ {name:"张三",age:25}, {name:"李四",age:26} ]; for(var i=0;i< ps.length;i++){ alert(ps[i].name); } /** * 创建一组用户,用户的属性有: * name:String,age:int,friends:Array */ ps = [ { name:"张三", age:25, friends:["abc","Alice"] }, { name:"李四", age:26, friends:["abc","Chris"] } ]; //通过工厂的方式来创建对象 function createPerson(name,age){ var o = new Object(); o.name = this.name; o.age = this.age; o.say = function(){ alert(this.name+":"+this.age); } return o; } //使用工厂的方式,虽然有效地解决了类的问题,但是也存在另一个问题: //我们无法检测对象p1和p2的具体数据类型,用typeof p1/p2 得到的只能是Object。 var p1 = createPerson("abc",21); var p2 = createPerson("bcd",23); p1.say(); //abc:21 p2.say(); //bcd:23 /** * 通过构造函数的方式创建,和基于工厂的创建方式类似, * 最大的区别就是函数的名称就是类的名称,按照Java约定,第一个字母大写, * 使用构造函数创建时,在函数内部是通过this关键字来完成属性的定义。 */ function Person(name,age){ this.name = name; this.age = age; //这种方式带来的问题是所有的Person对象都会为该行为分配空间 this.say = function(){ alert(this.name+","+this.age); } } //通过Person来创建对象 var p = new Person("lyf",24); p.say(); //lyf,24 /** * 使用构造函数的方式可以通过下方式来检测对象的类型 */ alert(p1 instanceof Person); //true alert(p1.say==p2.say); //false /**但是上述构造函数也会带来一些问题: * 1.每一个对象中都会存在一个方法的拷贝,如果对象的行为很对的话,空间的占有率就会大大增加 * 解决方法:可以将函数放到全局变量中定义,这样可以让类中的行为指向同一个函数。 */ function Person(name,age){ this.name = name; this.age = age; this.say = say; } //将行为设置为全局的 function(){ alert(this.name+","+this.age); } alert(p1.say==p2.say); //true//但是如果将行为设置为全局函数的时候,这个函数就可以被window调用,此时就破坏了对象的封装性。
//而且如果很多类用全局的方式定义了大量的方法,容易造成混乱,也将不利于开发。