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 相关文章推荐
Flash+XML滚动新闻代码 无图片 附源码下载
Nov 22 Javascript
分享20款好玩的jQuery游戏
Apr 17 Javascript
javascript数字格式化通用类 accounting.js使用
Aug 24 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
Mar 12 Javascript
Javascript添加监听与删除监听用法详解
Dec 19 Javascript
JavaScript结合AJAX_stream实现流式显示
Jan 08 Javascript
聊一聊JS中this的指向问题
Jun 17 Javascript
AngularJS基础 ng-focus 指令简单示例
Aug 01 Javascript
微信开发 使用picker封装省市区三级联动模板
Oct 28 Javascript
简单实现node.js图片上传
Dec 18 Javascript
JavaScript实现汉字转换为拼音及缩写的方法示例
Mar 28 Javascript
JavaScript实现飞舞的泡泡效果
Feb 07 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
实用函数2
2007/11/08 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
laravel5.6框架操作数据curd写法(查询构建器)实例分析
2020/01/26 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
javascript 日期常用的方法
2009/11/11 Javascript
JQuery onload、ready概念介绍及使用方法
2013/04/27 Javascript
jQuery之选项卡的简单实现
2014/02/28 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
2018/04/18 jQuery
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析
2020/04/07 Javascript
python 从远程服务器下载日志文件的程序
2013/02/10 Python
Python实现的RSS阅读器实例
2015/07/25 Python
python文件操作相关知识点总结整理
2016/02/22 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
Python编程django实现同一个ip十分钟内只能注册一次
2017/11/03 Python
Python多继承顺序实例分析
2018/05/26 Python
Python处理命令行参数模块optpars用法实例分析
2018/05/31 Python
Python实现随机创建电话号码的方法示例
2018/12/07 Python
Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】
2019/10/12 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
python3 googletrans超时报错问题及翻译工具优化方案 附源码
2020/12/23 Python
纯css3实现的鼠标悬停动画按钮
2014/12/23 HTML / CSS
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
线程问题:wait()方法是定义在哪个类里面
2015/07/07 面试题
护士的岗位职责
2013/12/04 职场文书
旷课检讨书大全
2014/01/21 职场文书
研讨会主持词
2014/04/02 职场文书
高中毕业典礼演讲稿
2014/09/09 职场文书
《梅花魂》教学反思
2016/02/18 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书