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 相关文章推荐
js函数使用技巧之 setTimeout(function(){},0)
Feb 09 Javascript
Extjs学习笔记之八 继承和事件基础
Jan 08 Javascript
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
Jul 13 Javascript
解决jquery的datepicker的本地化以及Today问题
May 23 Javascript
简单方法判断JavaScript对象为null或者属性为空
Sep 26 Javascript
Bootstrap模态框调用功能实现方法
Sep 19 Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
Mar 30 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
Aug 31 Javascript
vue中使用cropperjs的方法
Mar 01 Javascript
node.js中npm包管理工具用法分析
Feb 14 Javascript
js实现点击按钮随机生成背景颜色
Sep 05 Javascript
Axios代理配置及封装响应拦截处理方式
Apr 07 Vue.js
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生成条形码大揭秘
2015/09/24 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
PHP函数import_request_variables()用法分析
2016/04/02 PHP
PHP多进程之pcntl_fork的实例详解
2017/10/15 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
javascript 火狐(firefox)不显示本地图片问题解决
2008/07/05 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
canvas实现动态小球重叠效果
2017/02/06 Javascript
jquery操作select取值赋值与设置选中实例
2017/02/28 Javascript
通过npm引用的vue组件使用详解
2017/03/02 Javascript
js 用于检测类数组对象的函数方法
2017/05/02 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
跟老齐学Python之再深点,更懂list
2014/09/20 Python
简单介绍Python中的readline()方法的使用
2015/05/24 Python
python 通过 socket 发送文件的实例代码
2018/08/14 Python
python遍历小写英文字母的方法
2019/01/02 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
html5.2 dialog简介详解
2018/02/27 HTML / CSS
运动会入场解说词
2014/02/07 职场文书
部门群众路线教育实践活动对照检查材料思想汇报
2014/10/07 职场文书
学习普通话的体会
2014/11/07 职场文书
2014年营销工作总结
2014/11/22 职场文书
2014年共青团工作总结
2014/12/10 职场文书
学前班幼儿评语大全
2014/12/29 职场文书
68句权威创业名言
2019/08/26 职场文书
MySQL基础(二)
2021/04/05 MySQL
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python