javascript对象的创建

/*

  *在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调用,此时就破坏了对象的封装性。

//而且如果很多类用全局的方式定义了大量的方法,容易造成混乱,也将不利于开发。

欢迎分享本文,转载请保留出处:前端ABC » javascript对象的创建

分享到:更多 ()

发表评论 0