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 相关文章推荐
类似CSDN图片切换效果脚本
Sep 17 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
Feb 03 Javascript
JavaScript模拟实现继承的方法
Mar 30 Javascript
详解AngularJS的通信机制
Jun 18 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
Dec 20 Javascript
JavaScript中的原型继承基础学习教程
May 06 Javascript
JS实现焦点图轮播效果的方法详解
Dec 19 Javascript
JS中跳出循环的示例代码
Sep 14 Javascript
使用vuex较为优雅的实现一个购物车功能的示例代码
Dec 09 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
Aug 18 Javascript
js调用网络摄像头的方法
Dec 05 Javascript
JavaScript实现手风琴效果
Feb 18 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入门小知识
2008/03/24 PHP
在PHP中养成7个面向对象的好习惯
2010/07/17 PHP
PHP中运用jQuery的Ajax跨域调用实现代码
2012/02/21 PHP
php异常处理技术,顶级异常处理器
2012/06/13 PHP
PHP连接SQLServer2005的方法
2015/01/27 PHP
php编写的一个E-mail验证类
2015/03/25 PHP
PHP判断一个数组是另一个数组子集的方法详解
2017/07/31 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
gridview生成时如何去掉style属性中的border-collapse
2014/09/30 Javascript
JavaScript必知必会(六) delete in instanceof
2016/06/08 Javascript
js实现图片淡入淡出切换简易效果
2016/08/22 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
解决vue admin element noCache设置无效的问题
2019/11/12 Javascript
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
在DigitalOcean的服务器上部署flaskblog应用
2015/12/19 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
python实现门限回归方式
2020/02/29 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
python使用ctypes库调用DLL动态链接库
2020/10/22 Python
boostrap modal 闪现问题的解决方法
2020/09/01 HTML / CSS
美国女性奢华品牌精品店:INTERMIX
2017/10/12 全球购物
会计实习期自我鉴定
2013/10/06 职场文书
中专自我鉴定范文
2013/10/16 职场文书
排查整治工作方案
2014/06/09 职场文书
golang通过递归遍历生成树状结构的操作
2021/04/28 Golang
python 多态 协议 鸭子类型详解
2021/11/27 Python
Redis实现主从复制方式(Master&Slave)
2022/06/21 Redis
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python