铠姬 > Javascript对象创建

Javascript对象创建

简介


一、单一方式创建1、new形式var person=new Object();person.name=”Leo”;如果直接new完就了事,那没什么问题。如果new完还需要扩展属性,可以考虑使用工厂进行封装。工厂的使用下面有叙述。2、字面量形式var person={name:”Leo”};在构建函数参数,或者配置参数等场合中很是常见。3、工厂模式、寄生构造函数模式与稳妥构造函数模式function cratePerson(name,age){ var o=new Object; o.name=name; o.age=age; o.sayName=function(){alert(this.name)} return o;}var person=createPerson(“Leo”,18);/*此时创建了一个对象,这种方式叫工厂创建,或者稳妥构造函数模式。所谓稳妥构造函数模式就是不使用new和this创建对象*/var person2=new createPerson(“Leo”,18);//跟上面的效果一样,这样叫寄生构造//函数模式创建优点:封装了对象的创建过程,对具体的对象创建进行了隐藏,整个创建过程都在工厂之内,解除了对象创建的耦合,符合开放封闭原则。从而使对象的创建更加灵活,内部创建过程也很方便改进和扩展。而且可以定义私有变量。缺点:工厂模式没有解决对象的识别问题(即怎样知道一个对象的类型)。因为你创建的对象是Object的,而不会是person等其他类型。当然,这不是大问题,因为可以使用专用工厂进行创建。例如把var o=new Object换为var o=new Person();或者var o=new Person的子类();使用场合:此种模式常用于对现有对象进行扩展以及一些不能使用new跟this的安全环境中,例如我希望获取一个具有新值和新方法的数组对象,则可以这样:function MyArray(){ var values=new Array(); values.push(“Leo”); values.sayHi=function(){alert(“Hi”);}}var specialArray=new MyArray();于是就获取到了具备sayHi方法的特殊的数组对象了工厂方法典型应用:假设有Person类,Author与Writer类继承于Personfunction personFactory(condition){ switch conditioncase1:return new Author;break;case2:return new Writer;break;}4、构造函数模式function Person(name,age){ this.name=name; this.age=age; this.sayName=function(){alert(this.name)}}var person1=new Person(“Leo”,18);这里new Person(“Leo”,18),其实就是调用Person函数。不过调用new比较特殊,它会使Person的this等于等号左边的person1。所以这里new Person其实就相当于调用function Person(name,age){person1.name=name; person1.age=age; person1.sayName=function(){alert(this.name)}}于是person1就有了name,age和sayName属性。再废话一句,构造函数跟一般函数,其实没什么不同,这取决于你怎么去使用这个函数。如果你用new去调用,那这函数就可以视为构造函数,如:new Person();如果直接调用,那么就是普通函数,如:Person()。不同的是,new会使构造函数里面的this指向等号左边的对象。优点:解决了前面工厂模式未解决的对象识别问题。并且无法定义私有变量缺点:所有对象都会单独持有自己的属性。例如sayName函数,所有new Person创建出来的对象都会有这个属性。而实际上,sayName是没必要重复被创建的,应当所有对象共享一个sayName5、原型创建function Person(){}Person.prototype.name=”Leo”;Person.prototype.sayName=function(){console.log(this.name);}var p1=new Person();p1.sayName();//输出Leovar p2=new Person();p2.name=”Linda”p2.sayName();//输出Lindap1.sayName();//也是输出Linda优点:弥补了构造函数重复创建sayName函数的缺点,但仍然无法定义私有变量缺点:原型的优点是由于共享,而其缺点也正是由于共享。共享函数通常是正确的,但是如果共享属性则会出问题。所以如果类有除了函数之外的其他属性的话,建议不要单独使用原型创建二、组合方式创建1、构造函数和原型方式组合示例如下:function Person(){ this.name=”Leo”; }Person.prototype.sayName=function(){console.log(this.name;)}var p=new Person();p.sayName();//打出Leo,如果把this.name改为var name则这里会打出空字符,//也就是说,无法定义私有变量优点:结合了构造函数跟原型创建两种方式之所长缺点:仍然无法定义私有变量2、完美的动态原型模式示例:function Person(){var name="Leo";if(typeof this.getName != "function"){/*这里只判断一个getName就可以知道Person的prototype是否有初始化了,如果已经初始化就没必要往下执行,如果没有初始化就需要往下执行将prototype初始化*/Person.prototype.getName=function(){console.log(name);};Person.prototype.setName=function(n){ name=n;}} }这个动态原型基本可以说非常完美了。既有构造函数和原型的优势,该共享的属性共享,不该共享的属性不共享,同时还可以定义私有变量。不过这里仍然有一个小小的遗憾,如果在其他对象里面调用Person,Person还是会对其原型再初始化一次,例如直接调用,也就是在window调用,即直接Person(),当然这种情况通常是误用此构造函数的情况。不过还是可以对这种情况进行改进。只需要对Person构造函数加一个判断,再为Person增加一个静态工厂即可。完整示例代码如下:function Person(){var name="Leo";if(this.constructor!=Person) throw new Error("只能通过Person的getInstance方法调用此构造函数");if(typeof this.getName != "function"){Person.prototype.getName=function(){console.log(name);};Person.prototype.setName=function(n){ name=n;}} }Person.getInstance=function(){return new Person();}//此时只能通过getInstance方//法获取到Person的对象实例,至此,问题完美解决

点击显示全文

  • 怎么来使用JavaScript String对象?

    字符串是不可变的。字符串方法,不会改变原有字符串的内容,而是返回一个新字符串。如何使用JavaScript String对象...

    发布时间:2018-09-22 18:33:37
    841244
  • 【JavaScript 】jquery延迟对象

    Promise是从Deferred中派生的一个子类。在使用的时候首先就是创建一个延迟对象:var dfd = new $.D...

    发布时间:2018-09-22 18:33:37
    759464
  • 如何快速创建一个javascript对象

    最简单的,教你用记事本写javascript对象。桌面新建编辑代码如下文件“另存为”保存文件名,编码和文件类型然后在桌面上找...

    发布时间:2018-09-22 18:21:50
    310856
  • JavaScript创建对象的三种方法

    JavaScript创建对象的三种方法详细讲解Windows系统web开发环境第一种是在js函数中定义一个...

    发布时间:2018-09-22 18:12:34
    218499
  • JavaScript高级程序设计笔记:[1]创建对象

    使用Object构造函数或者对象字面量都可以用来创建单个对象,但是创建多个对象<...

    发布时间:2018-09-22 18:33:36
    382672
  • Javascript中的JSON对象

    Javascript中的JSON对象Javascript中的JSON对象1.JSON对象的自定义在Javascript中,可...

    发布时间:2018-09-22 18:58:55
    887389
  • String 对象 JavaScript

    字符串字符串文本是以单引号或双引号括起零个或多个字符。  字符串文本具有 string 的主(基元)数据类型。   String 对象通过使用...

    发布时间:2018-09-22 19:01:24
    406894
  • JavaScript对象——navigato对象

    过简单的代码演示,来说明JavaScript中的日期对象Date常用的属性和方法。文本编辑器任意,记事本,editplus,...

    发布时间:2018-09-22 18:35:39
    995147
加载中...
加载中...
今日热点信息
精彩推荐
手机版 | 欢迎来到铠姬
RSS订阅