JavaScript创建对象的写法 |
本文标签:JavaScript,创建对象 对象是什么 最简单的对象 复制代码 代码如下: var obj={}; var obj2=new Object(); 这样构建出来的对象仅仅包含一个指向Object的prototype的指针,可以使用一些valueOf、hasQwnProperty等方法,没有多大实际作用,自定义对象嘛总要有一些自定义的属性、方法神马的 。 复制代码 代码如下: var obj={}; obj.a=0; obj.fn=function(){ alert(this); } var obj2={ a:0, fn:function(){ alert(this); } }
抽象一下 复制代码 代码如下: function createObj(a,fn){ var obj={}; obj.a=a; obj.fn=fn; return obj; } var obj=createObj(2,function(){ alert(this.a); }); 这样在创建大量对象的时候,就可以通过调用此方法来做一些重复工作了,这种方式也不完美,因为在很多时候需要判断对象的类型,上面代码创建出来的对象都是最原始的Object对象实例,只是拓展了一些属性和方法 。 有型一些 又是function登场的时候,JavaScript中function就是个对象,在创建对象的时候打可以抛开上面createObj方法,直接使用function作为对象,怎么实现复用呢,这就在于function作为对象的特殊性了 。 1. function可以接受参数,可以根据参数来创建相同类型不同值的对象 2. function作为构造函数(通过new操作符调用)的时候会返回一个对象,在贫下中农版jQuery中提到过一些构造函数的基本知识,简单复制一下 构造函数的返回值分为两种情况,当function没有return语句或者return回一个基本类型(bool,int,string,undefined,null)的时候,返回new 创建的一个匿名对象,该对象即为函数实例;如果function体内return一个引用类型对象(Array,Function,Object等)时,该对象会覆盖new创建的匿名对象作为返回值 。 3. 那么使用function怎么解决类型识别问题呢,每个function实例对象都会有一个constructor属性(也不是“有”,而是可以对应),这个属性就可以指示其构造是谁,也可以使用instanceof 操作符来做判断对象是否为XXX的实例 。 不能光说不练,上代码 复制代码 代码如下: function Person(name){ this.name=name; this.fn=function(){ alert(this.name); } } var person1=new Person(Byron); console.log(person1.constructor==Person);//true console.log(person1 instanceof Person); //true 这样就完美了吧,也不是!虽然构造函数可以是对象有型,但对象的每个实例中的方法都要重复一遍! 复制代码 代码如下: function Person(name){ this.name=name; this.fn=function(){ alert(this.name); } } var person1=new Person(Byron); var person2=new Person(Frank); console.log(person1.fn==person2.fn);//false 看看看,虽然两个实例的fn一模一样,但是却不是一回事儿,这如果一个function对象有一千个方法,那么它的每个实例都要包含这些方法的copy,很让内存无语啊 。 不玩儿虚的了 复制代码 代码如下: function Person(name){ this.name=name; } Person.prototype.share=[]; Person.prototype.printName=function(){ alert(this.name); } var person1=new Person(Byron); var person2=new Person(Frank); console.log(person1.printName==person2.printName);//true 这样每个Person的实例都有自己的属性name,又有所有实例共享的属性share和方法printName,基本问题都解决了,对于一般的对象处理就可以始终这个有型又有爱的创建对象模式了 。 |