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 获取中文拼音,Select自动匹配字母获取值的代码
Sep 23 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
Jun 28 Javascript
location对象的属性和方法应用(解析URL)
Apr 12 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
Apr 16 Javascript
JQuery实现的图文自动轮播效果插件
Jun 19 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
Apr 22 Javascript
纯原生js实现贪吃蛇游戏
Apr 16 Javascript
Vue-Router的使用方法
Sep 05 Javascript
微信小程序实现带缩略图轮播效果
Nov 04 Javascript
vue根据条件不同显示不同按钮的操作
Aug 04 Javascript
浅谈JavaScript节流和防抖函数
Aug 25 Javascript
解决新建一个vue项目过程中遇到的问题
Oct 22 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
js实现ASP分页函数 HTML分页函数
2006/09/22 Javascript
JavaScript 变量命名规则
2009/09/23 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
js表头排序实现方法
2015/01/16 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
浅析node连接数据库(express+mysql)
2015/11/30 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
Nodejs中的require函数的具体使用方法
2019/04/02 NodeJs
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
初步探究Python程序的执行原理
2015/04/11 Python
手把手教你Python yLab的绘制折线图的画法
2019/10/23 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
HTML5实践-图片设置成灰度图
2012/11/12 HTML / CSS
美国女性服饰销售网站:Nasty Gal(坏女孩)
2016/07/26 全球购物
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
给女儿的表扬信
2014/01/18 职场文书
渡河少年教学反思
2014/02/12 职场文书
大学学风建设方案
2014/05/04 职场文书
实习单位证明范例
2014/11/17 职场文书
人事行政主管岗位职责
2015/04/09 职场文书
赢在中国观后感
2015/06/02 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
如何才能写好调研报告?
2019/07/03 职场文书
正能量励志演讲稿三分钟(范文)
2019/07/11 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书