首页 > 代码库 > javascript创建对象(一)

javascript创建对象(一)

对象定义:无序属性的集合,属性包含基本值、对象、函数,相当于一组没有特定顺序的值。

   创建自定义对象最简单的方式就是:

1 var movie=new Object();2 movie.name="Interstellar";3 movie.year=2014;4 movie.country="American";5 movie.playMovie=function(){6     alert(this.name);7 };
View Code

  当然还可以写成对象自变量的方式:

var movie={      name:"Interstellar",      year:2014,      country:"American",      playMovie:function(){        alert(this.name);}};

 上面两种都有明显的缺点:如果使用同一个接口创建很多对象,那么会产生大量的重复代码

 所以出现了工程模式,还是以前面的例子来修改:

function showMovie(name,year,country){        var p=new Object();        p.name=name;        p.year=year;        p.country=country;        p.playMovie=function(){           alert(this.name);};   return p;}

用的时候直接赋给一个变量:

var movie1=showMovie("Interstellar",2014,"American");

var movie2=showMovie("FleetofTime",2014,"China");

工厂模式虽然解决了创建多个相似对象的问题,但是没有解决对象识别的问题(怎样知道一个对象的类型),

于是构造函数出现,接着前面例子修改:

function Movie(name,year,country){      this.name=name;
this.year=year; this.country=country; this.playMovie=function(){ alert(this.name);};}//注意://这里没有return,没有显示的创建对象,把方法和属性都赋给了this对象;//构造函数始终应该以一个大写字母开头,而非构造函数则以小写开头;

这里有几种调用构造函数的方式:

第一种通过new操作符:

var movie1=new Movie("Interstellar",2014,"American");

var movie2=new Movie("FleetofTime",2014,"China");

movie1、movie2都有一个constructor属性,指向Movie

alert(movie1.constructor==Movie);//truealert(movie2.constructor==Movie);//true;

当然检测对象类型instanceof操作符要更可靠一些

alert(movie1 instanceof Movie);//truealert(movie2 instanceof Movie);//truealert(movie1 instanceof Object);//truealert(movie2 instanceof Object);//true

注意的是所有对象都继承自Object;

 

第二种调用是把它作为普通的函数来调用,那么属性和方法都被添加到window对象了撒:

Movie("Interstellar",2014,"American");window.playName();// "Interstellar"

第三种就是通过call()(apply())来到另一个对象的作用域中调用:

var p=new Object();Movie.call(p,"FleetOfTime",2014,"China");p.playMovie();//FleetOfTime

  以上就是调用构造函数的三种方式了,那么构造函数有什么问题呢,可以试着执行下面代码发现不同实例上的同名函数不相等

 

alert(movie1.playMovie==movie2.playMovie)//false//构造函数主要的问题就是每个方法都要在每个实例上重新创建一遍

 我们可以通过把函数定义转移到构造函数外面来解决这个问题,如下:

function Movie(name,year,country){      this.name=name;      this.year=year;      this.country=country;     this.playMovie=playMovie;} funciton playMovie(){    alert(this.name);}//这里构造函数里面的playMovie包含一个指向函数的指针

  但是如果对象需要定义很多方法,那么就需要定义很多个全局函数了。所以出现了原型模式,当然原型模式也会存在问题,目前一般是运用构造函数+原型的组合方法来创建对象。见下节。。

 

最后:1937年12月13日,侵华日军野蛮侵入南京,制造了惨绝人寰的南京大屠杀惨案,30万同胞惨遭杀戮,无数妇女遭到蹂躏残害,无数儿童死于非命,三分之一建筑遭到毁坏,大量财物遭到掠夺。侵华日军一手制造的这一灭绝人性的大屠杀惨案,是第二次世界大战史上“三大惨案”之一,是骇人听闻的反人类罪行,是人类历史上十分黑暗的一页,勿忘国耻。

  

  

 

  

  

javascript创建对象(一)