JavaScript进阶系列03,通过硬编码、工厂模式、构造函数创建JavaScript对象
本篇体验通过硬编码、工厂模式、构造函数来创建JavaScript对象。
□ 通过硬编码创建JavaScript对象
当需要创建一个JavaScript对象时,我们可能这样写:
var person = {firstName: "Darren",lastName: "Ji",getFullName: function() {return this.firstName + " " + this.lastName;}};
如果需要创建2个结构相同的对象,我们可能这样写:
var person = {firstName: "Darren",lastName: "Ji",getFullName: function() {return this.firstName + " " + this.lastName;}};var person2 = {firstName: "Darren2",lastName: "Ji2",getFullName: function () {return this.firstName + " " + this.lastName;}};
□ 通过工厂模式创建JavaScript对象
但实际上,还可以通过工厂模式来创建JavaScript对象。
var person1 = createPerson("Darren1", "Ji1"),person2 = createPerson("Darren2", "Ji2");function createPerson(firstName, lastName) {return {firstName: firstName,lastName: lastName,getFullName: function() {return this.firstName + " " + this.lastName;}};}
继续在createPerson函数中增加一个方法,并调用。
var person1 = createPerson("Darren1", "Ji1"),person2 = createPerson("Darren2", "Ji2");alert(person1.greet(person2));function createPerson(firstName, lastName) {return {firstName: firstName,lastName: lastName,getFullName: function() {return this.firstName + " " + this.lastName;},greet: function(person) {if (typeof person.getFullName !== "undefined") {return "hello, " + person.getFullName();} else {return "are u here?";}}};}
输出结果:hello, Darren2 Ji2
如果person1.greet方法的实参为匿名对象,如下:
alert(person1.greet({}));
输出结果:are u here?
□ 通过构造函数创建JavaScript对象
就像通过var arr = new Array()创建数组对象,通过var date = new Date()创建日期对象,JavaScript允许我们创建自定义数据类型。
var Person = function(firstName, lastName) {this.firstName = firstName;this.lastName = lastName;this.getFullName = function() {return this.firstName + " " + this.lastName;};this.greet = function(person) {if (person instanceof Person) {return "hello, " + person.getFullName();} else {return "are u here?";}};};var person1 = new Person("Darren", "Ji"),person2 = new Person("Jack", "Zhang");alert(person1.greet({getFullName: "this is string"}));
输出结果:are u here?
○ 变量Peson的第一个字母大写,这是一个惯例,表示Peson是自定义数据类型
○ this表示Person对象
○ instanceof用来判断变量是否是某种数据类型
○ 通过new来创建数据类型对象,new关键字不可获取,否则,在本例中this会指向window
○ 因为person1.greet()的实参不是Peson类型,所以输出了are u here?
如果把最后一行代码改成:
alert(person1.greet(person2));
输出结果:hello, Jack Zhang
但这里还有一点小问题:getFullName和greet可看作是对象,每次通过new创建Peson对象时,相当于在内存上创建了2份的Peson对象,以及2份的getFullName和greet对象,这增加了内存开销。是否可以让getFullName和greet放到一个公共的地方,然后每个Peson对象都可以引用他们呢?--prototype属性此时就可以用上了!
var Person = function(firstName, lastName) {this.firstName = firstName;this.lastName = lastName;};Person.prototype.getFullName = function () {return this.firstName + " " + this.lastName;};Person.prototype.greet = function (person) {if (person instanceof Person) {return "hello, " + person.getFullName();} else {return "are u here?";}};var person1 = new Person("Darren", "Ji"),person2 = new Person("Jack", "Zhang");alert(person1.greet(person2));
输出结果:hello, Jack Zhang
以上,在Peson的prototype属性上定义的方法,能够被每个Peson对象共享,这从一定程度上减少了内存开销。
“JavaScript进阶系列”包括:
JavaScript进阶系列01,函数的声明,函数参数,函数闭包
JavaScript进阶系列02,函数作为参数以及在数组中的应用
JavaScript进阶系列03,通过硬编码、工厂模式、构造函数创建JavaScript对象
JavaScript进阶系列04,函数参数个数不确定情况下的解决方案
JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数
JavaScript进阶系列06,事件委托
JavaScript进阶系列07,鼠标事件
JavaScript进阶系列03,通过硬编码、工厂模式、构造函数创建JavaScript对象的更多相关文章
- JavaScript进阶系列07,鼠标事件
		
鼠标事件有Keydown, Keyup, Keypress,但Keypress与Keydown和Keyup不同,如果按ctrl, shift, caps lock......等修饰键,不会触发Keyp ...
 - JavaScript进阶系列06,事件委托
		
在"JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数"中已经有了一个跨浏览器的事件处理机制.现在需要使用这个 ...
 - JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数
		
本篇体验JavaScript事件的基本面,包括: ■ 事件必须在页面元素加载之后起效■ 点击事件的一个简单例子■ 为元素注册多个点击事件■ 获取事件参数 ■ 跨浏览器事件处理 □ 事件必须在页面元素加 ...
 - JavaScript进阶系列04,函数参数个数不确定情况下的解决方案
		
本篇主要体验函数参数个数不确定情况下的一个解决方案.先来看一段使用函数作为参数进行计算的实例. var calculate = function(x, y, fn) { return fn(x, y) ...
 - JavaScript进阶系列02,函数作为参数以及在数组中的应用
		
有时候,把函数作为参数可以让代码更简洁. var calculator = { calculate: function(x, y, fn) { return fn(x, y); } }; var su ...
 - JavaScript进阶系列01,函数的声明,函数参数,函数闭包
		
本篇主要体验JavaScript函数的声明.函数参数以及函数闭包. □ 函数的声明 ※ 声明全局函数 通常这样声明函数: function doSth() { alert("可以在任何时候调 ...
 - 通过硬编码获取dubbo服务对象
		
运维进行监控dubbo服务的时候可能会调用dubbo服务对象,并且定期去执行,这时候如果需要添加新的服务,可能需要修改监控dubbo服务的配置,即dubbo-producer.xml或是dubbo-c ...
 - 03.设计模式_抽象工厂模式(Abstract Fcatory)
		
抽象工厂模式:创建一些列相关或者互相依赖的对象的接口,而无需指定他们具体的类, 1.创建工厂Factory: package patterns.design.factory; import java. ...
 - Java 设计模式系列(二)简单工厂模式和工厂方法模式
		
Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...
 
随机推荐
- 数据库SQL语句性能优化
			
选择最有效率的表名顺序 ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下 ...
 - 大数据的常用算法(分类、回归分析、聚类、关联规则、神经网络方法、web数据挖掘)
			
在大数据时代,数据挖掘是最关键的工作.大数据的挖掘是从海量.不完全的.有噪声的.模糊的.随机的大型数据库中发现隐含在其中有价值的.潜在有用的信息和知识的过程,也是一种决策支持过程.其主要基于人工智能, ...
 - jquery模型(外壳实现)
			
详细解释: 1.现在传入的参数是window,document,可以知道是它俩引用 2. 3. 4.每次调用jquery方法,都会创建一个实例,但是内存并没有暴涨,原因是:jquery里面new 的这 ...
 - Java中关于HashMap源码的研究
			
1.基础知识 1.数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大.但数组的二分查找时间复杂度小,为O(1):数组的特点是:寻址容易,插入和删除困难. 2.链表 链表存储区间离散,占用内存比 ...
 - Oracle JDK vs OpenJDK
			
OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea.UltraViolet都是从OpenJDK源码衍生出的 ...
 - 【LOJ】#2492. 「BJOI2018」二进制
			
题解 每次开这样的数据结构题感想都大概是如下两点 1.为什么别人代码长度都是我的1/2???? 2.为什么我运行时间都是他们的两倍???? 简单分析一下,我们关注一个区间是否合法只关注这个区间有多少个 ...
 - babel更新之后的 一些坑
			
最近在使用babel-loader的时候,发生了一些错误,现在的babel-loader版本已经是8.0.0,更新到这个版本之后,如果还按照以前的安装依赖的方法: cnpm install --sav ...
 - SpringBoot详细研究-05微服务与拾遗
			
这将是SpringBoot学习系列的最后一篇文章,主要涉及Spring Cloud和JHispter两个知识点,都具有一定综合性,需要多加实践加强理解. Spring Cloud 微服务Microse ...
 - normalizr实践使用(个人总结,仅供参考)
			
# normalizr实践使用 原数据 (自编数据,本数据仅供参考) var aaaObj ={ "id" : "0000000000000000000000000000 ...
 - Linux系统的组成
			
<linux系统7大子系统> a:SCI(system call interface) ————用户程序通过软件中断后,调用系统内核提供的功能,这个在用户空间和内核提供的服务之间的接口称为 ...