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 相关文章推荐
javascript基础知识大集锦(二) 推荐收藏
Jan 13 Javascript
javascript设置和获取cookie的方法实例详解
Jan 05 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
Jul 14 Javascript
省市区三级联动jquery实现代码
Apr 15 Javascript
移动端js图片查看器
Nov 17 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
Nov 22 Javascript
AngularJS入门教程之Helloworld示例
Dec 25 Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
Jun 08 Javascript
layui表格checkbox选择全选样式及功能的实例
Mar 07 Javascript
Vue验证码60秒倒计时功能简单实例代码
Jun 22 Javascript
从零开始用electron手撸一个截屏工具的示例代码
Oct 10 Javascript
vue-devtools的安装和使用步骤详解
Oct 17 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实现获取图片颜色值的方法
2014/07/11 PHP
用javascript实现在小方框中浏览大图的代码
2007/08/14 Javascript
escape、encodeURI 和 encodeURIComponent 的区别
2009/03/02 Javascript
jquery 简短右键菜单 多浏览器兼容
2010/01/01 Javascript
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
JavaScript的递归之递归与循环示例介绍
2013/08/05 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
2015/09/17 Javascript
深入理解Angular4订阅(Subscribe)与取消
2017/11/22 Javascript
web前端页面生成exe可执行文件的方法
2018/02/08 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
2019/05/01 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
Vue通过for循环随机生成不同的颜色或随机数的实例
2019/11/09 Javascript
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
Python中动态创建类实例的方法
2017/03/24 Python
python使用 HTMLTestRunner.py生成测试报告
2017/10/20 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
美国殿堂级滑板、冲浪、滑雪服装品牌:Volcom(钻石)
2017/04/20 全球购物
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
介绍一下MD5加密算法
2016/11/12 面试题
超市营业员求职简历的自我评价
2013/10/17 职场文书
酒店副总岗位职责
2013/12/24 职场文书
运动会通讯稿400字
2014/01/28 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
电大毕业生自我鉴定
2014/04/10 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
党章培训心得体会
2014/09/04 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
教研活动主持词
2015/07/03 职场文书
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python
数据库连接池
2021/04/06 MySQL
Python基础知识之变量的详解
2021/04/14 Python
Python3 多线程(连接池)操作MySQL插入数据
2021/06/09 Python