同系列友情链接:


1.设计模式之初体验—精读《JavaScript 设计模式》Addy Osmani著
2.设计模式的分类—精读《JavaScript 设计模式》Addy Osmani著

Construct(构造器)模式


在经典的面向对象编程语言中,Construtor是一种在内存已分配给该对象的情况下,用于初始化新创建对象的特殊方法。

在 JavaScript 中,几乎所有东西都是都是对象,可能你会经常找不到对象,?,你承认不??

来看一下什么是 Object构造器 :

用于创建特定类型的对象——准备好对象以备使用,同时接受构造器可以使用的参数,以在第一次创建对象时,设置成员属性和方法值。

下图为:Constructor(构造器)模式

对象的创建

在 JavaScript 中,创建对象时有发生,常见的创建方式有两种:

  1. 直接空对象赋值;
  2. 使用 new关键字
// 1. 直接空对象赋值
var newObject = {};// 2. 使用 new 关键字创建,newObject构造器的简洁记法
var newObject = new Object();
复制代码

在 Object构造器为特定的值创建对象封装,或者没有传递值时,它将创建 一个空对象并返回这个空对象;

对象的赋值

四种方法可以将键值赋值给一个对象:

  1. ECMAScript 3 兼容方式;

    1. “点”语法;
    2. 中括号语法
  2. 只适用于ECMAScript 5 方式;
    1. Object.defineProperty;
    2. Object.defineProperties
// 1.点语法
// 设置属性
newObject.someKey = "Hello World!";
// 获取属性值
var key = newObject.someKey;// 2.中括号语法
// 设置属性
newObject["somekey"] = "Hello world!";
// 获取属性值
var key = newObject["somekey"];// 3.Object.defineProperty
// 设置属性
Object.defineProperty(newObject,"somekey",{value:"Hello World!",// 该属性对应的值,默认为undefinedwritable:true,// 能否修改属性的值,如果直接使用字面量定义对象,默认值为trueenumerable:true,// 表示该属性是否可枚举,即是否通过for-in循环或Object.keys()返回属性,如果直接使用字面量定义对象,默认值为trueconfigurable:true// 表示能否通过delete删除此属性,能否修改属性的特性,或能否修改把属性修改为访问器属性,如果直接使用字面量定义对象,默认值为true
});
// 也可以简化一下这种方式
var defineProp = function(obj,key,value){config.value=value;Object.defineProperty(obj,key,config);
}
// 使用上述方式,先创建一个空的 person对象
var person = Object.create(null);
// 然后设置各个属性
defineProp(person,"car","Delorean");
defineProp(person,"dateOfBrith","1989");
defineProp(person,"hasBeard",false);
// 获取属性值同1,2
var key_car = person["car"];
var key_dateOfBrith = person["dateOfBrith"];
var key_hasBeard = person["hasBeard"];// 4.Object.defineProperties
// 设置属性
Object.defineProperties(newObject,{"someKey":{value:"Hello World!",writable:true},"anotherKey":{value:"Foo Bar",writable:false}
});
// 获取属性值同1,2
var key_someKey = person["someKey"];
var key_anotherKey = person["anotherKey"];复制代码

上面定义的这些方法甚至可以用于继承如下所示:

// 用法
// 创建赛车司机 driver 对象,继承于 person 对象
var driver = Object.create(person);
// 为 driver 设置一些属性
defineProp(deriver,"topSpeed","100mph");
// 获取继承属性
console.log(driver.dateOfBrith);
// 获取我们设置的100mph属性
console.log(driver.topSpeed);复制代码

基本Constructor(构造器)

大家都知道 JavaScript 不支持类的概念,但是它却支持与对象一起使用的 特殊的 Constructor 函数。通过在构造器前面加 new关键字,告诉 JavaScript 像使用构造器一样实例化一个新的对象,并且对象成员由该函数定义。

在构造器内,关键字 this引用新创建的对象。回顾对象创建,基本的构造器看起来可能是这样的:

function Car(model,year,miles){this.model = model;this.year = year;this.miles = miles;this.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 构造器创建的新对象而重新定义的。 这不是最理想的,因为这种函数应该在所有的 Car 实例之间共享。

其实这个问题很好解决,因为有很多ES3和 ES5兼容替代方法能够用于创建对象。

带原型的Constructor(构造器)

JavaScript中有一个名为 prototype 的属性。调用 JavaScript 构造器创建一个对象后,新的对象就具有构造器原型的所有属性。通过这种方式,可以创建多个 Car 对象,并访问相同的原型。所以我们可以扩展原始示例,如下所示:

function Car(model,year,miles){this.model = model;this.year = year;this.miles = miles;
}
// 前方警告:小伙伴是否还记得反模式一条:避免重新定义 prototype对象
// 所以下面我们是使用 Object.prototype.newMethod而不是Object.prototype来定义对象内部的方法
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 对象之间共享了
复制代码

小结

今天的构造器模式,是不是很nice?

但是,你掌握了多少?

你可以动动小手指示例代码都敲一遍,相信你可以更进一步了解,掌握 Constructor(构造器)模式。

下一篇将对Module(模块)模式做详细的介绍。这一模式更精彩,因为很快你就会知道为什么别人都那么写了,以及模块化的相关概念等等等

( ^_^ )/~~拜拜

3.Contructor(构造器)模式—精读《JavaScript 设计模式》Addy Osmani著相关推荐

  1. JS代理模式《JavaScript设计模式与开发实践》阅读笔记

    代理模式 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问. 保护代理和虚拟代理 保护代理:当有许多需求要向某对象发出一些请求时,可以设置保护代理,通过一些条件判断对请求进行过滤. 虚拟 ...

  2. 《JavaScript设计模式》读后感 觉很复杂

    接触前端两三个月的时候,那时候只是听说设计模式很重要,然后我就去读了一本设计模式的书,读了一部分,也不知道这些设计模式到底设计出来干嘛的,然后就没再看了.后来就自己做一些小项目也觉着好像不需要用到设计 ...

  3. 《JavaScript设计模式》读后感

    接触前端两三个月的时候,那时候只是听说设计模式很重要,然后我就去读了一本设计模式的书,读了一部分,也不知道这些设计模式到底设计出来干嘛的,然后就没再看了.后来就自己做一些小项目也觉着好像不需要用到设计 ...

  4. javascript设计模式-Constructor(构造器)模式

    Constructor是一种在内存已分配给该对象的情况下,用于初始化新创建对象的特殊方法.Object构造器用于创建特定类型的对象–准备好对象以备使用,同事接收构造器可以使用参数,以在第一次创建对象时 ...

  5. [书籍精读]《JavaScript设计模式与开发实践》精读笔记分享

    写在前面 书籍介绍:本书在尊重<设计模式>原意的同时,针对JavaScript语言特性全面介绍了更适合JavaScript程序员的了16个常用的设计模式,讲解了JavaScript面向对象 ...

  6. JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂——区分“变与不变”

    JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·简单工厂--区分"变与不变" 先来说说构造器 在介绍工厂模式之前,为了辅助大家的理解,我想先在这儿给大家介绍 ...

  7. JavaScript设计模式之构造器、模块和原型

    JavaScript面向对象 JavaScript是一种无类语言,但可以使用函数来模拟,这就涉及到设计模式.模式是一种已经验证过的可复用的解决方案,可用于解决软件设计中遇到的常见的问题,通常将这些解决 ...

  8. JavaScript设计模式系列—模式篇总结(上)

    转载请注明预见才能遇见的博客:http://my.csdn.net/ 原文地址:https://blog.csdn.net/pcaxb/article/details/102517956 JavaSc ...

  9. 《JavaScript设计模式与开发实践》模式篇(12)—— 装饰者模式

    在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但是继承的方式并不灵活, 还会带来许多问题:一方面会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之 改变;另一方面,继承这种功能复 ...

最新文章

  1. 第十六届全国大学生智能车竞赛全国总决赛获奖排行榜
  2. 鸿蒙投屏和普通投屏,华为智慧屏SE发布:预装鸿蒙 可一碰投屏
  3. 腾讯2017年第三季度财报:微信广告收入大幅增长
  4. String类split方法
  5. 怎样编写测试类测试分支_测试技巧–不编写测试
  6. C#中的类声明和对象定义方法实验
  7. 计算机和学数制和码制,[文学]第二章 计算机中的数制和码制.ppt
  8. 力扣-1534. 统计好三元组
  9. 阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第6节 Lambda表达式_6_Lambda表达式有参数有返回值的...
  10. pandas读取csv文件数据并使用matplotlib画折线图和饼图
  11. Flutter 2.5 的新特性
  12. 计算机ping使用的端口,ping端口命令是什么
  13. 【笔记】ARM裸机程序开发_part3
  14. linux 找不到vmdk,找不到文件vmdk虚拟磁盘
  15. ajax实现读取文件内容打印,javascript结合ajax读取txt文件内容
  16. 实验吧天网管理系统Writeup
  17. 怎么压缩gif图大小,gif压缩到微信表情
  18. 移动互联风口频现,百度高德谁已手握地图关键钥匙
  19. 一文读懂电磁学发展史[图文版]
  20. 下载安装MarkDown保姆级

热门文章

  1. 单调栈 leetcode整理(一)
  2. python 子图大小_Python | 图的大小
  3. ci框架 mysql 超时时间_mysql 字符集和校验规则( CHARSET amp; COLLATE)
  4. hdu 3094——A tree game
  5. C++ 模板的局限性以及解决01
  6. 获取网络接口信息——ioctl()函数与结构体struct ifreq、 struct ifconf
  7. 函数fork vfork
  8. 膜拜大牛!HTTPS面试常问全解析,吊打面试官系列!
  9. mysql shell 回车换行_【shell mysql 导出数据到csv脚本,完美解决乱码转义符等问题】-费元星...
  10. 29 _react-router说明