JS对象创建的几种方式整理


Posted in Javascript onFebruary 28, 2017

最近一直在看JS高级程序设计这本书,有空来梳理一下几种创建对象的方式。话不多说,直接步入正题。

第一种:Object构造函数创建

var Person = new Object();
Person.name = 'Nike';
Person.age = 29;

这行代码创建了Object引用类型的一个新实例,然后把实例保存在变量Person中。

第二种:使用对象字面量表示法

var Person = {};//相当于var Person = new Object();
var Person = {
 name:'Nike';
 age:29;  
}

对象字面量是对象定义的一种简写形式,目的在于简化创建包含大量属性的对象的过程。也就是说,第一种和第二种方式创建对象的方法其实都是一样的,只是写法上的区别不同

在介绍第三种的创建方法之前,我们应该要明白为什么还要用别的方法来创建对象,也就是第一种,第二种方法的缺点所在:它们都是用了同一个接口创建很多对象,会产生大量的重复代码,就是如果你有100个对象,那你要输入100次很多相同的代码。那我们有什么方法来避免过多的重复代码呢,就是把创建对象的过程封装在函数体内,通过函数的调用直接生成对象。

第三种:使用工厂模式创建对象

function createPerson(name,age,job){
 var o = new Object();
 o.name = name;
 o.age = age;
 o.job = job;
 o.sayName = function(){
  alert(this.name); 
 };
 return o; 
}
var person1 = createPerson('Nike',29,'teacher');
var person2 = createPerson('Arvin',20,'student');

在使用工厂模式创建对象的时候,我们都可以注意到,在createPerson函数中,返回的是一个对象。那么我们就无法判断返回的对象究竟是一个什么样的类型。于是就出现了第四种创建对象的模式。

第四种:使用构造函数创建对象

function Person(name,age,job){
 this.name = name;
 this.age = age;
 this.job = job;
 this.sayName = function(){
 alert(this.name);
 }; 
}
var person1 = new Person('Nike',29,'teacher');
var person2 = new Person('Arvin',20,'student');

对比工厂模式,我们可以发现以下区别:

1.没有显示地创建对象

2.直接将属性和方法赋给了this对象

3.没有return语句

4.终于可以识别的对象的类型。对于检测对象类型,我们应该使用instanceof操作符,我们来进行自主检测:

alert(person1 instanceof Object);//ture
alert(person1 instanceof Person);//ture
alert(person2 instanceof Object);//ture
alert(person2 instanceof Object);//ture

同时我们也应该明白,按照惯例,构造函数始终要应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。

那么构造函数确实挺好用的,但是它也有它的缺点:

就是每个方法都要在每个实例上重新创建一遍,方法指的就是我们在对象里面定义的函数。如果方法的数量很多,就会占用很多不必要的内存。于是出现了第五种创建对象的方法

第五种:原型创建对象模式

function Person(){}
Person.prototype.name = 'Nike';
Person.prototype.age = 20;
Person.prototype.jbo = 'teacher';
Person.prototype.sayName = function(){
 alert(this.name);
};
var person1 = new Person();
person1.sayName();

使用原型创建对象的方式,可以让所有对象实例共享它所包含的属性和方法。

如果是使用原型创建对象模式,请看下面代码:

function Person(){}
Person.prototype.name = 'Nike';
Person.prototype.age = 20;
Person.prototype.jbo = 'teacher';
Person.prototype.sayName = function(){
 alert(this.name);
};
var person1 = new Person();
var person2 = new Person();
person1.name ='Greg';
alert(person1.name); //'Greg' --来自实例
alert(person2.name); //'Nike' --来自原型

当为对象实例添加一个属性时,这个属性就会屏蔽原型对象中保存的同名属性。

这时候我们就可以使用构造函数模式与原型模式结合的方式,构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性

第六种:组合使用构造函数模式和原型模式

function Person(name,age,job){
 this.name =name;
 this.age = age;
 this.job = job;
}
Person.prototype = {
 constructor:Person,
 sayName: function(){
 alert(this.name);
 };
}
var person1 = new Person('Nike',20,'teacher');

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
javascript Select标记中options操作方法集合
Oct 22 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
Sep 06 Javascript
angularJS 入门基础
Feb 09 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
Sep 24 Javascript
简单的jQuery banner图片轮播实例代码
Mar 04 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
Apr 28 Javascript
基于Bootstrap table组件实现多层表头的实例代码
Sep 07 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
Jan 04 Javascript
在vue使用clipboard.js进行一键复制文本的实现示例
Jan 15 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
Feb 21 Javascript
浅谈vue中$event理解和框架中在包含默认值外传参
Aug 07 Javascript
VUE : vue-cli中去掉路由中的井号#操作
Sep 04 Javascript
js仿淘宝评价评分功能
Feb 28 #Javascript
jQuery布局组件EasyUI Layout使用方法详解
Feb 28 #Javascript
three.js绘制地球、飞机与轨迹的效果示例
Feb 28 #Javascript
JavaScript Uploadify文件上传实例
Feb 28 #Javascript
微信小程序 ecshop地址三级联动实现实例代码
Feb 28 #Javascript
简单实现AngularJS轮播图效果
Apr 10 #Javascript
ie下js不执行的几种可能
Feb 28 #Javascript
You might like
国王的咖啡这么大来头,名字的由来是什么
2021/03/03 咖啡文化
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
php把时间戳转换成多少时间之前函数的实例
2016/11/16 PHP
laravel 字段格式化 modle 字段类型转换方法
2019/09/30 PHP
jquery的index方法实现tab效果
2011/02/16 Javascript
Jquery each方法跳出循环,并获取返回值(实例讲解)
2013/12/12 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
去除html代码里面的script正则方法
2016/05/19 Javascript
js实现延迟加载的几种方法
2017/04/24 Javascript
vue router下的html5 history在iis服务器上的设置方法
2017/10/18 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
python实现的登陆Discuz!论坛通用代码分享
2014/07/11 Python
跟老齐学Python之玩转字符串(3)
2014/09/14 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
对numpy Array [: ,] 的取值方法详解
2018/07/02 Python
python 剪切移动文件的实现代码
2018/08/02 Python
python SocketServer源码深入解读
2019/09/17 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
Python通过format函数格式化显示值
2020/10/17 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
const和static readonly区别
2013/05/20 面试题
sort命令的作用和用法
2012/11/04 面试题
财务人员个人求职信范文
2013/12/04 职场文书
计算机专业毕业生自我鉴定
2014/01/16 职场文书
员工生日活动方案
2014/08/24 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
研究生毕业论文导师评语
2014/12/31 职场文书
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python
zabbix如何添加监控主机和自定义监控项
2022/08/14 Servers