JavaScript的构造器模式

来源:互联网 发布:室内设计软件 编辑:程序博客网 时间:2024/04/30 00:16

经典的OOP语言中,构造器(也叫构造函数)是一个用于初始化对象的特殊方法。在JS中,因为一切皆对象,对象构造器经常被提起。

对象构造器用于建立制定类型(Class)的对象,可以接受参数用于初始化对象的属性和方法。

对象建立

在JS中,有三个常用的方法用于建立对象:

//1, 推荐使用var newObject = {}; //2,var newObject = Object.create( null ); //3, 不推荐var newObject = new Object();

但是,这也只是建立了三个空对象, 并没有任何属性和方法。我们可以通过以下四种方法,为对象设立属性和方法。

// ECMAScript 3 兼容的方式// 1. 常规对象定义方式//设置属性newObject.someKey = "Hello World"; //获取属性var key = newObject.someKey; // 2. 方括号方式// 设置属性newObject["someKey"] = "Hello World"; //获取属性var key = newObject["someKey"]; // 仅仅用于ECMAScript 5 // 3. Object.defineProperty// 设置属性Object.defineProperty(  newObject, "someKey",  { value: "for more control of the property's behavior",    writable: true,    enumerable: true,    configurable: true});//可以通过下面的函数简化属性设置var defineProp = function ( obj, key, value ){     config.value = value;     Object.defineProperty( obj, key, config );};// 使用方法var person = Object.create( null );defineProp( person, "car", "Delorean" );defineProp( person, "dateOfBirth", "1981" );defineProp( person, "hasBeard", false );// 4. Object.defineProperties//设置属性Object.defineProperties( newObject, { "someKey": { value: "Hello World", writable: true },  "anotherKey": { value: "Foo bar", writable: false } });// 3和4的获取属性方法同1,2.

基本的构造器

我们知道, JS中没有Class的概念,但它也支持用构造器建立对象。
通过使用【new】关键字,我们可以使一个函数的举止类似于构造器,从而建立自己的对象实例。
一个基础的构造器形式如下:

function Car( model, year, miles ) {       //这里,this指向新建立的对象自己      this.model = model;      this.year = year;      this.miles = miles;      this.toString = function () {            return this.model + " has done " + this.miles + " miles";      };}//用法// 建立两个car实例var civic = new Car( "Honda Civic", 2009, 20000 );var mondeo = new Car( "Ford Mondeo", 2010, 5000 );// 输出结果 console.log( civic.toString() );console.log( mondeo.toString() );

这就是简单的构造器模式, 它有两个主要问题,
第一,它很难继承;第二,toString()被每一个对象实例定义一遍,作为函数,它应该被每一个Car类型的实例共享。


使用原型的构造器

JS中有一个很好的特性:原型【Prototype】,
利用它,建立对象时,所有构造器原型中的属性都可以被对象实例获得。
这样多个对象实例就可以共享同一个原型。
我们改善前面的Car例子如下:

function Car( model, year, miles ) {      this.model = model;      this.year = year;      this.miles = miles;}Car.prototype.toString = function () {      return this.model + " has done " + this.miles + " miles";};// 用法var civic = new Car( "Honda Civic", 2009, 20000 );var mondeo = new Car( "Ford Mondeo", 2010, 5000 );//输出console.log( civic.toString() );console.log( mondeo.toString() );

在上面的例子中,toString()方法被多个Car对象实例共享。




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 熬夜皮肤暗黄怎么办 经常熬夜睡眠不好怎么办 经常熬夜皮肤不好怎么办 皮肤熬夜变暗黄怎么办 晚上上夜班白天睡不着怎么办 熬夜肾虚怎么办才能好 经常熬夜口气重怎么办 晚上睡不着白天起不来怎么办 晚上熬夜白天睡不着怎么办 在外打工孩子上学怎么办 婴儿脸干燥发红怎么办 宝宝脸上红点点怎么办 药流出血量少怎么办 药流喝药第一天发烧了怎么办 药流第一天量很少怎么办 小孩不想吃饭口臭怎么办 晚上上班白天睡不着怎么办 新车刮漆了怎么办 药流出血多怎么办 药流第二天没血怎么办 有异味怎么办%3f 养狗后悔了怎么办 买狗后悔了怎么办 小孩子不想去幼儿园怎么办 小孩子不想上幼儿园怎么办 想当兵视力不够怎么办 当兵裸眼视力差怎么办 去公司报道行李怎么办 报道第一天出糗怎么办 痛经一直想拉屎怎么办 月经第一天痛经怎么办 痛经痛得厉害怎么办 脑子里老是幻想怎么办 绿松石盘玩变黑怎么办 绿松石发乌了怎么办 泡脚泡的脚发黑怎么办 想当兵有纹身怎么办 小孩挨打不会还手怎么办 孩子挨打不敢还手怎么办 武警森林改革新兵怎么办 森林武警新兵后来怎么办