js中的面向对象之对象常见创建方法详解


Posted in Javascript onDecember 16, 2019

本文实例讲述了js中的面向对象之对象常见创建方法。分享给大家供大家参考,具体如下:

创建对象的几种常用方式

1.使用Object或对象字面量创建对象

2.工厂模式创建对象

3.构造函数模式创建对象

4.原型模式创建对象

1.使用Object或对象字面量创建对象

使用object

var student = new Object();
student.name = "easy";
student.age = "20";

使用字面量

var sutdent = {
 name : "easy",
 age : 20
};

2.工厂模式创建对象

function createStudent(name, age) {
 var obj = new Object();
 obj.name = name;
 obj.age = age;
 return obj;
}
var student1 = createStudent("easy1", 20);
var student2 = createStudent("easy2", 20);
...
var studentn = createStudent("easyn", 20);

3.构造函数模式创建对象

在上面创建Object这样的原生对象的时候,我们就使用过其构造函数

var obj = new Object();

在创建原生数组Array类型对象时也使用过其构造函数:

var arr = new Array(10); //构造一个初始长度为10的数组对象

我们首先了解一下构造函数和普通函数有什么区别。

1、实际上并不存在创建构造函数的特殊语法,其与普通函数唯一的区别在于调用方法。对于任意函数,使用new操作符调用,那么它就是构造函数;不使用new操作符调用,那么它就是普通函数。

2、按照惯例,我们约定构造函数名以大写字母开头,普通函数以小写字母开头,这样有利于显性区分二者。例如上面的new Array(),new Object()。

3、使用new操作符调用构造函数时,会经历(1)创建一个新对象;(2)将构造函数作用域赋给新对象(使this指向该新对象);(3)执行构造函数代码;(4)返回新对象;4个阶段。

ok,了解了构造函数和普通函数的区别之后,我们使用构造函数将工厂模式的函数重写,并添加一个方法属性:

function Student(name, age) {
 this.name = name;
 this.age = age;
 this.alertName = function(){
  alert(this.name)
 };
}
function Fruit(name, color) {
 this.name = name;
 this.color = color;
 this.alertName = function(){
  alert(this.name)
 };
}

这样我们再分别创建Student和Fruit的对象

var v1 = new Student("easy", 20);
var v2 = new Fruit("apple", "green");

这时我们再来用instanceof操作符来检测以上对象类型就可以区分出Student以及Fruit了:

alert(v1 instanceof Student); //true
alert(v2 instanceof Student); //false
alert(v1 instanceof Fruit); //false
alert(v2 instanceof Fruit); //true
alert(v1 instanceof Object); //true 任何对象均继承自Object
alert(v2 instanceof Object); //true 任何对象均继承自Object

可以将上面的函数简化:Student和Fruit对象中共有同样的方法移到构造函数外部

function Student(name, age) {
 this.name = name;
 this.age = age;
}
function Fruit(name, color) {
 this.name = name;
 this.color = color;
};
function alertName() {
 alert(this.name);
}

我们通过将alertName()函数定义为全局函数,这样对象中的alertName属性则被设置为指向该全局函数的指针。由此stu1和stu2共享了该全局函数,解决了内存浪费的问题

但是,通过全局函数的方式解决对象内部共享的问题,终究不像一个好的解决方法。如果这样定义的全局函数多了,我们想要将自定义对象封装的初衷便几乎无法实现了。

更好的方案是通过原型对象模式来解决。

4.原型的模式创建对象

原型链甚至原型继承,是整个JS中最难的一部分也是最不好理解的一部分,在这里由于我们课程定位的原因,如果对js有兴趣的同学,可以去查阅一下相关JS原型的一些知识点。

function Student() {
  this.name = 'easy';
  this.age = 20;
}
Student.prototype.alertName = function(){
  alert(this.name);
};
var stu1 = new Student();
var stu2 = new Student();
stu1.alertName(); //easy
stu2.alertName(); //easy
alert(stu1.alertName == stu2.alertName); //true 二者共享同一函数

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jQuery不兼容input的change事件问题解决过程
Dec 05 Javascript
轻松实现JavaScript图片切换
Jan 12 Javascript
JavaScript String 对象常用方法详解
May 13 Javascript
JS组件Bootstrap Select2使用方法解析
May 30 Javascript
微信小程序 wxapp画布 canvas详细介绍
Oct 31 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
Jun 16 jQuery
Angularjs 事件指令详细整理
Jul 27 Javascript
微信小程序实现滴滴导航tab切换效果
Jul 24 Javascript
利用Promise自定义一个GET请求的函数示例代码
Mar 20 Javascript
JS获取动态添加元素的方法详解
Jul 31 Javascript
element-ui 文件上传修改文件名的方法示例
Nov 05 Javascript
openlayers4实现点动态扩散
Aug 17 Javascript
js实现数字滚动特效
Dec 16 #Javascript
NUXT SSR初级入门笔记(小结)
Dec 16 #Javascript
js实现内置计时器
Dec 16 #Javascript
js实现秒表计时器
Dec 16 #Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
Dec 16 #Javascript
js实现计时器秒表功能
Dec 16 #Javascript
原生Vue 实现右键菜单组件功能
Dec 16 #Javascript
You might like
PHP定时执行计划任务的多种方法小结
2011/12/19 PHP
Yii2实现自定义独立验证器的方法
2017/05/05 PHP
JavaScript 撑出页面文字换行
2009/06/15 Javascript
Javascript(AJAX)解析XML的代码(兼容FIREFOX/IE)
2010/07/11 Javascript
ASP.NET jQuery 实例5 (显示CheckBoxList成员选中的内容)
2012/01/13 Javascript
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
js中style.display=""无效的解决方法
2014/10/30 Javascript
js实例属性和原型属性示例详解
2014/11/23 Javascript
jQuery 中DOM 操作详解
2015/01/13 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
jQuery实用小技巧_输入框文字获取和失去焦点的简单实例
2016/08/25 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
vue.js绑定class和style样式(6)
2016/12/09 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
2018/07/07 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
iSlider手机端图片滑动切换插件使用详解
2019/12/24 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
JS typeof fn === 'function' && fn()详解
2020/08/22 Javascript
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
详解python读取image
2019/04/03 Python
Python Django 实现简单注册功能过程详解
2019/07/29 Python
python3.6编写的单元测试示例
2019/08/17 Python
Django实现基于类的分页功能
2019/10/31 Python
wxPython之wx.DC绘制形状
2019/11/19 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
基于python实现获取网页图片过程解析
2020/05/11 Python
深入了解Python 方法之类方法 & 静态方法
2020/08/17 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
简单介绍Object类的功能、常用方法
2013/10/02 面试题
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
教师党员自我评价2015
2015/03/04 职场文书
优秀的商业计划书,让融资一步到位
2019/05/07 职场文书