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 相关文章推荐
extjs 学习笔记(二) Ext.Element类
Oct 13 Javascript
jQuery 名称冲突的解决方法
Apr 08 Javascript
IE6、IE7中获取Button元素的值的bug说明
Aug 28 Javascript
javascript判断机器是否联网的2种方法
Aug 09 Javascript
jQuery Form 页面表单提交的小例子
Nov 15 Javascript
jQuery使用之标记元素属性用法实例
Jan 19 Javascript
基于对象合并功能的实现示例
Oct 10 Javascript
详解Node.js模板引擎Jade入门
Jan 19 Javascript
微信网页授权并获取用户信息的方法
Jul 30 Javascript
JavaScript对象拷贝与赋值操作实例分析
Dec 10 Javascript
C#程序员入门学习微信小程序的笔记
Mar 05 Javascript
如何在项目中使用log4.js的方法步骤
Jul 16 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
关于BIG5-HKSCS的解决方法
2007/03/20 PHP
PHP form 表单传参明细研究
2009/07/17 PHP
php实现从上传文件创建缩略图的方法
2015/04/02 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
关于PHP虚拟主机概念及如何选择稳定的PHP虚拟主机
2018/11/20 PHP
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
解析Javascript小括号“()”的多义性
2013/12/03 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
jQuery循环滚动新闻列表示例代码
2014/06/17 Javascript
jQuery+JSON实现AJAX二级联动实例分析
2015/12/18 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
JS从数组中随机取出几个数组元素的方法
2016/08/02 Javascript
vue.js中指令Directives详解
2017/03/20 Javascript
详解升级react-router 4 踩坑指南
2017/08/14 Javascript
浅谈Vue2.0中v-for迭代语法的变化(key、index)
2018/03/06 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
Python 中字符串拼接的多种方法
2018/07/30 Python
Django分页查询并返回jsons数据(中文乱码解决方法)
2018/08/02 Python
python中如何实现将数据分成训练集与测试集的方法
2019/09/13 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
Python join()函数原理及使用方法
2020/11/14 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
实习教师自我鉴定
2013/09/27 职场文书
仓库组长岗位职责
2014/01/29 职场文书
演讲稿祖国在我心中
2014/05/04 职场文书
环境保护建议书
2014/08/26 职场文书
世界文化遗产导游词
2015/02/13 职场文书
货款欠条范本
2015/07/03 职场文书
分享15个Webpack实用的插件!!!
2021/03/31 Javascript