详细分析Javascript中创建对象的四种方式


Posted in Javascript onAugust 17, 2016

前言

使用Javascript创建对象的方式有很多,现在就来列举一下其中的四种方式,并且罗列出了每种方式的优缺点,可以让大家进行选择使用,下面来看看。

工厂模式

function createPerson(name, age){
 var obj = new Object();
 obj.name = name;
 obj.age = age;
 return obj; //一定要返回,否则打印undefined:undefined
 }
 var person1 = new createPerson('Young',18);
 console.log(person1.name + ':' + person1.age);

优点:工厂模式可以解决创建多个相似对象

缺点:没有解决对象识别问题(怎样确定一个对象的类型)

构造函数模式

function Person(name,age){
 this.name = name;
 this.age = age;
 }
 var person1 = new Person('Young',18);
 console.log(person1.name + ':' + person1.age);

在说优缺点之前,先来说说她本身的一点小故事吧

将构造函数当做函数使用

function Person(name,age){
 this.name=name;
 this.age=age;
 this.sayName=function(){
 return this.name;
 }
 }
 
 //当做构造函数使用
 var person1 = new Person('Young', 18);
 person1.sayName();
 console.log(person1.name + ':' + person1.age);
 
 //当做普通函数调用
 Person('Wind', 18);
 console.log(window.sayName());
 
 //在另一个作用域中调用
 var obj = new Object();
 Person.call(obj, 'bird', 100);
 console.log(obj.sayName());

构造函数优缺点

优点:可以将它的实例标识为一种特定类型

缺点:每个方法都要在每个实例上重新创建一遍。当然你也可以这样改:

function Person(name, age){
 this.name = name;
 this.age = age;
 this.sayName = sayName;
 }
 function sayName(){
 return this.name;
 }

改为调用全局函数,这样一来毫无封装性可言。。。接下来的原型模式可以弥补这个的不足

原型模式

function Person(){
 
 }
 Person.prototype.name = 'Young';
 Person.prototype.age = 18;
 Person.prototype.sayName = function(){
 return this.name;
 }
 
 var person1 = new Person();
 console.log(person1.sayName());
 var person2 = new Person();
 console.log(person1.sayName());
 alert(person1.sayName === person2.sayName);
 //person1和person2访问的是同一组属性的同一个sayName()函数

虽然可以通过对象实例访问保存在原型中的值,但却不能通过实例对象重写原型中的值

function Person(){
 
 }
 Person.prototype.name='Young';
 Person.prototype.age=18;
 Person.prototype.sayName=function(){
 return this.name;
 }
 
 var person1=new Person();
 var person2=new Person();
 person1.name='Wind';
 
 console.log(person1.sayName());//Wind
 console.log(person2.sayName());//Young
 alert(person1.sayName==person2.sayName);//true

在我们调用person1.sayName的时候,会先后执行两次搜索,解析器先确定实例person1是否有sayName的属性,有则调用自己的属性,没有则搜索原型中的属性。

function Person(){
 
 }
 Person.prototype.name='Young';
 Person.prototype.age=18;
 Person.prototype.sayName=function(){
 return this.name;
 }
 
 var person1=new Person();
 var person2=new Person();
 
 person1.name='Wind';
 console.log(person1.sayName());//Wind
 console.log(person2.sayName());//Young
 
 delete person1.name;
 console.log(person1.sayName());//Young
 console.log(person2.sayName());//Young

使用hasOwnPropertyType方法可以检测一个属性是存在与原型中还是存在于实例中,该方法是从Object继承来的,实例中为true,原型中为false。

枚举对象上的实例属性用Object.keys()方法

function Person(){
 
 }
 Person.prototype.name='Young';
 Person.prototype.age=18;
 Person.prototype.sayName=function(){
 return this.name;
 }
 
 var keys=Object.keys(Person.prototype);
 console.log(keys);//["name", "age", "sayName"]

原型模式优缺点

优点:不用每个方法都要在每个实例上重申一遍

缺点:很少有人单独使用原型模式地。。问题详列

function Person(){
 
 }
 Person.prototype={
 constructor:Person,
 name:'Young',
 age:18,
 friends:['Big','Pig'],
 sayName:function(){
 return this.name;
 }
 };
 var p1=new Person();
 var p2=new Person();
 p1.friends.push('Mon');
 console.log(p1.friends);//["Big", "Pig", "Mon"]
 console.log(p2.friends);//["Big", "Pig", "Mon"]

正是因为实例一般都要有自己的属性,而我们这里将他放在了Person.prototype中,所以随着p1的修改,整个实例包括原型都修改了。那么,我们可以组合使用构造函数模式和原型模式。

组合使用构造函数模式和原型模式

function Person(name,age){
 this.name=name;
 this.age=age;
 this.friends=['Big','Pig'];
 }
 Person.prototype={
 sayName:function(){
 return this.name;
 }
 };
 var p1=new Person('Young',18);
 var p2=new Person('Wind',78);
 p1.friends.push('Raganya');
 console.log(p1.friends);//["Big", "Pig", "Raganya"]
 console.log(p2.friends);//["Big", "Pig"]
 console.log(p1.friends==p2.friends);//false
 console.log(p1.sayName==p2.sayName);//true

这种模式是目前使用最广泛、认同度最高的一种创建自定义类型的方法。是用来定义引用类型的一种默认模式。

总结

以上就是关于分析Javascript中创建对象方式的全部内容,通过这篇文章为大家总结的四种方式和其优缺点,希望可以对大家学习使用Javascript能有所帮助。

Javascript 相关文章推荐
jquery select下拉框操作的一些说明
Apr 02 Javascript
jquery 图片缩放拖动的简单实例
Jan 08 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
Oct 23 Javascript
一系列Bootstrap导航条使用方法分享
Apr 29 Javascript
DWR3 访问WEB元素的两种方法实例详解
Jan 03 Javascript
原生JS轮播图插件
Feb 09 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
Nov 28 Javascript
vue中实现图片和文件上传的示例代码
Mar 16 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
Aug 12 Javascript
移动端图片上传旋转、压缩问题的方法
Oct 16 Javascript
基于ts的动态接口数据配置的详解
Dec 18 Javascript
Vue ECharts实现机舱座位选择展示功能
May 15 Vue.js
AngularJS表单详解及示例代码
Aug 17 #Javascript
AngularJS模块详解及示例代码
Aug 17 #Javascript
Bootstrap 源代码分析(未完待续)
Aug 17 #Javascript
AngularJS HTML DOM详解及示例代码
Aug 17 #Javascript
AngularJS表格详解及示例代码
Aug 17 #Javascript
AngularJS过滤器详解及示例代码
Aug 16 #Javascript
AngularJS控制器详解及示例代码
Aug 16 #Javascript
You might like
php数组应用之比较两个时间的相减排序
2008/08/18 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
thinkphp3.2.2前后台公用类架构问题分析
2014/11/25 PHP
详解PHP中的mb_detect_encoding函数使用方法
2015/08/18 PHP
实例分析PHP中PHPMailer发邮件
2017/12/13 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
为你的 Laravel 验证器加上多验证场景的实现
2020/04/07 PHP
几个高效,简洁的字符处理函数
2007/04/12 Javascript
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
js将long日期格式转换为标准日期格式实现思路
2013/04/07 Javascript
jQuery中对未来的元素绑定事件用bind、live or on
2014/04/17 Javascript
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
2015/08/06 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记9)
2015/12/24 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
2017/02/09 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
使用Node.js实现ORM的一种思路详解(图文)
2017/10/24 Javascript
利用babel将es6语法转es5的简单示例
2017/12/01 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
matplotlib绘制符合论文要求的图片实例(必看篇)
2017/06/02 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
Django 实现 Websocket 广播、点对点发送消息的代码
2020/06/03 Python
Python中用xlwt制作表格实例讲解
2020/11/05 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
国外平面设计第一市场:99designs
2016/10/25 全球购物
一套VC试题
2015/01/23 面试题
如何利用find命令查找文件
2015/02/07 面试题
问卷调查计划书
2014/01/10 职场文书