js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)

 更新时间:2015年11月09日 09:32:14   投稿:mrr  
JS的语法非常灵活,简单的对象创建就有好几种不同的方法。这些过于灵活的地方有时候确实很让人迷惑,那么今天我们就来梳理一下JS中常用的创建对象的几种方法吧

在上篇文章给大家介绍了javascript面向对象基础,本篇文章继续深入学习javascript面向对象,JS的语法非常灵活,简单的对象创建就有好几种不同的方法。这些过于灵活的地方有时候确实很让人迷惑,那么今天我们就来梳理一下JS中常用的创建对象的几种方法吧。

前言

虽然使用 Object构造函数 或者使用 对象字面量 可以很方便的用来创建一个对象,但这种方式有一个明显的缺点:使用一个接口创建多个对象会产生很多冗余的代码。因此为了解决这个问题,人们开始使用以下几种方式来常见对象。

工厂模式

该模式抽象了创建对象的具体过程,用函数来以特定接口创建对象的细节

 function cPerson(name,sex,age){
 var o = new Object();
 o.name = name;
 o.sex = sex;
 o.age = age;
 o.show = function(){
 console.log(this.name,this.age,this.sex);
 }
 return o;
}
 var p1 = cPerson('谦龙','男','100');
 p1.show();
 var p2 = cPerson('雏田','女','14');
 p2.show();

工厂模式测试

工厂方式的问题:使用工厂模式能够创建一个包含所有信息的对象,可以无数次的调用的这个函数。虽然其解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即如何得知一个对象的类型)

构造函数模式

function CPerson(name,sex,age) {//注意这里 构造函数首字母大写
 this.name = name;
 this.sex = sex;
 this.age = age;
 this.show = function () {
 console.log(this.name, this.age, this.sex);
 }
}
var p1 = new CPerson('谦龙','男','100');
 p1.show();
var p2 = new CPerson('雏田','女','14');
 p2.show();

构造函数模式测试

注意构造函数与工厂模式有些不同的地方,如下

构造函数首字母大写

没有显式地创建对象

将属性和方法赋值给了 this 对象

没有return语句

而且以这种方式来调用构造函数会大致经历一下 几个步骤

创建一个新的对象

将构造函数的作用域赋值给这个对象(因此this就指向了这个对象)

执行构造函数中的代码(即给新对象添加属性和方法的过程)

返回对象

注意:构造函数其实和普通的函数没有太大的差别,唯一的不同在于调用方式的不同。以下演示不同的几种调用方式

 // 调用方式1 new 方式
 var p1 = new CPerson('谦龙','男','100');
 p1.show();//谦龙 100 男
 // 调用方式2 普通函数调用
 CPerson('谦龙','男','100');
 window.show()//谦龙 100 男 注意属性和方法会被设置到window对象上
 // 调用方式3 在另一个对象的作用域中调用
 var obj = new Object();
 CPerson.call(obj,'谦龙','男','100');
 obj.show(); //谦龙 100 男 在obj的作用域

构造函数的问题:使用构造函数最主要的问题就是每个方法都要在每个实例上重新创建一次,p1与p2的都有show方法,但不是同一个Function的实例,因为function在js中也是一个对象。因此他们共有的show方法并不相等。

原型模式

每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象。而这个对象的用途是 包含可以由 特定类型 的所有 实例 共享的属性和方法。即调用构造函数所创建的那个对象的 原型对象

好处是可以让所有对象的实例共享他的属性的方法。即无需在构造函数中定义实例的信息

 function CPerson(){
}
CPerson.prototype.name='谦龙';
CPerson.prototype.sex='男';
CPerson.prototype.age=100;
CPerson.prototype.show=function(){
 console.log(this.name, this.age, this.sex);
}
var p1 = new CPerson();
 p1.show(); //谦龙 100 男
var p2 = new CPerson();
 p2.show();//谦龙 100 男
 console.log(p1.show == p2.show)//true

以上内容是关于js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式),希望大家喜欢。

相关文章

  • jquery 实现输入邮箱时自动补全下拉提示功能

    jquery 实现输入邮箱时自动补全下拉提示功能

    大家在做Web项目,都会有注册登录模块,如果是邮箱注册,想要在输入@后触发下拉框显示各个邮箱的功能。下面介绍一款jQuery实现输入邮箱的时候,可自动补全邮箱地址,也可称为是“输入提示”的功能,比如输入aaa时,自动变成aaa@163.com,有效提升网页的人性化体验
    2015-10-10
  • JS实现为表格动态添加标题的方法

    JS实现为表格动态添加标题的方法

    这篇文章主要介绍了JS实现为表格动态添加标题的方法,涉及javascript中createCaption方法添加标题的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • JavaScript作用域与作用域链深入解析

    JavaScript作用域与作用域链深入解析

    这篇文章主要是对JavaScript作用域和作用域链作简单的介绍,希望能帮助大家更好的学习JavaScript
    2013-12-12
  • JavaScript 作用域实例分析

    JavaScript 作用域实例分析

    这篇文章主要介绍了JavaScript 作用域,结合实例形式分析了JavaScript函数作用域相关概念、原理及操作注意事项,需要的朋友可以参考下
    2019-10-10
  • js或jquery动态输出select option的实现代码

    js或jquery动态输出select option的实现代码

    在 JavaScript 中动态生成 <option> 元素并添加到 <select> 下拉列表中,可以通过以下几种方式实现,以下是不同场景下的完整代码示例
    2025-03-03
  • javascript中CheckBox全选终极方案

    javascript中CheckBox全选终极方案

    在javascript页面中实现CheckBox或者Radio的选中状态是一件很容易的事情,下面我们来给大家展示下在asp.net中使用javascript中CheckBox全选终极方案,有需要的小伙伴可以参考下。
    2015-05-05
  • Bootstrap实现导航栏的2种方式

    Bootstrap实现导航栏的2种方式

    这篇文章主要为大家详细介绍了Bootstrap实现导航栏的2种方式,一是利用按钮组实现、二是Bootstrap专门做了相应的css类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 微信小程序人脸识别功能代码实例

    微信小程序人脸识别功能代码实例

    这篇文章主要介绍了微信小程序人脸识别功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • 基于javascript实现日历功能原理及代码实例

    基于javascript实现日历功能原理及代码实例

    这篇文章主要介绍了基于javascript实现日历效果原理及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 微信小程序实现图片上传功能的思路与源码

    微信小程序实现图片上传功能的思路与源码

    我们日常开发中经常需要用到图片上传功能,这篇文章主要给大家介绍了关于微信小程序实现图片上传功能的思路与源码的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11

最新评论