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 相关文章推荐
ppk谈JavaScript style属性
Oct 10 Javascript
枚举的实现求得1-1000所有出现1的数字并计算出现1的个数
Sep 10 Javascript
jQuery固定元素插件scrolltofixed使用指南
Apr 21 Javascript
基于Vuejs实现购物车功能
Aug 02 Javascript
jQuery与JS加载事件用法分析
Sep 04 Javascript
jQuery实现 上升、下降、删除、添加一行代码
Mar 06 Javascript
JavaScript中错误正确处理方式小结你用对了吗
Oct 10 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
Oct 24 Javascript
js前端面试之同步与异步问题详解
Apr 03 Javascript
如何使用webpack打包一个库library的方法步骤
Dec 18 Javascript
vue随机验证码组件的封装实现
Feb 19 Javascript
微信小程序实现点击导航条切换页面
Nov 19 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 utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
基于php中echo用逗号和用点号的区别详解
2018/01/23 PHP
JavaScript函数详解
2014/11/17 Javascript
jQuery 调用WebService 实例讲解
2016/06/28 Javascript
原生js获取iframe中dom元素--父子页面相互获取对方dom元素的方法
2016/08/05 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
浅谈webpack4.x 入门(一篇足矣)
2018/09/05 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
解决微信小程序中的滚动穿透问题
2019/09/16 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
Python httplib模块使用实例
2015/04/11 Python
python获取本机mac地址和ip地址的方法
2015/04/29 Python
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
Python中关键字nonlocal和global的声明与解析
2017/03/12 Python
Python+matplotlib+numpy绘制精美的条形统计图
2018/01/02 Python
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
2018/09/27 Python
python快排算法详解
2019/03/04 Python
Python结合Window计划任务监测邮件的示例代码
2020/08/05 Python
python opencv角点检测连线功能的实现代码
2020/11/24 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
使用canvas对多图片拼合并导出图片的方法
2018/08/28 HTML / CSS
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
彪马日本官网:PUMA日本
2019/01/31 全球购物
美国运动鞋类和服装零售连锁店:Shoe Palace
2019/08/13 全球购物
泰国时尚电商:POMELO Fashion
2020/03/11 全球购物
亚洲最大的运动鞋寄售店:KicksCrew
2020/11/26 全球购物
自我评价范文分享
2014/01/04 职场文书
目标责任书格式
2014/07/28 职场文书
妇女工作先进事迹
2014/08/17 职场文书
新党章心得体会
2014/09/04 职场文书
go语言中切片与内存复制 memcpy 的实现操作
2021/04/27 Golang
python基础入门之字典和集合
2021/06/13 Python