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 相关文章推荐
ext form 表单提交数据的方法小结
Aug 08 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
Apr 02 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
Nov 25 Javascript
js中switch case循环实例代码
Dec 30 Javascript
jquery Validation表单验证使用详解
Sep 12 Javascript
JS瀑布流实现方法实例分析
Dec 19 Javascript
Javascript实现基本运算器
Jul 15 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
Aug 22 Javascript
详解JavaScript的变量
Apr 04 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
Apr 23 Javascript
JavaScript 事件代理需要注意的地方
Sep 08 Javascript
jQuery实现朋友圈查看图片
Sep 11 jQuery
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
基于mysql的bbs设计(三)
2006/10/09 PHP
用Zend Encode编写开发PHP程序
2010/02/21 PHP
Laravel 5.3 学习笔记之 安装
2016/08/28 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
FLASH 广告之外的链接
2008/12/16 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
基于jQuery实现模拟页面加载进度条
2013/04/01 Javascript
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
JS控制弹出新页面窗口位置和大小的方法
2015/03/02 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
2015/09/30 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
关于微信中a链接无法跳转问题
2016/08/02 Javascript
js拖拽功能实现代码解析
2016/11/28 Javascript
JS实现含有中文字符串的友好截取功能分析
2017/03/13 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
2018/02/24 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
vue的token刷新处理的方法
2018/07/17 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
node.js获取参数的常用方法(总结)
2017/05/29 Python
pyinstaller参数介绍以及总结详解
2019/07/12 Python
基于Python的接口自动化unittest测试框架和ddt数据驱动详解
2021/01/27 Python
Pytorch 图像变换函数集合小结
2021/02/01 Python
美国体育用品商店:Rally House(NCAA、NFL、MLB、NBA、NHL和MLS)
2018/01/03 全球购物
庆七一活动方案
2014/01/25 职场文书
合作经营协议书
2014/04/17 职场文书
体育馆的标语
2014/06/24 职场文书
nginx+lua单机上万并发的实现
2021/05/31 Servers