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动态添加样式(行内式/嵌入式/外链式等规则)
Jun 24 Javascript
javascript 树形导航菜单实例代码
Aug 13 Javascript
理解javascript对象继承
Apr 17 Javascript
jQuery短信验证倒计时功能实现方法详解
May 25 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
Jun 08 Javascript
Javascript DOM事件操作小结(监听鼠标点击、释放,悬停、离开等)
Jan 20 Javascript
几种响应式文字详解
May 19 Javascript
vue中计算属性(computed)、methods和watched之间的区别
Jul 27 Javascript
探究react-native 源码的图片缓存问题
Aug 24 Javascript
使用webpack3.0配置webpack-dev-server教程
May 29 Javascript
jquery-ui 进度条功能示例【测试可用】
Jul 25 jQuery
js中addEventListener()与removeEventListener()用法案例分析
Mar 02 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中利用substr_replace将指定两位置之间的字符替换为*号
2011/01/27 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
2013/06/18 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
2014/09/04 PHP
PHP获取指定日期是星期几的实现方法
2016/11/30 PHP
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
jquery 全局AJAX事件使用代码
2010/11/05 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
快速掌握Node.js事件驱动模型
2016/03/21 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
2016/05/19 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
详解使用vue实现tab 切换操作
2017/07/03 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
详解vue 路由跳转四种方式 (带参数)
2019/04/28 Javascript
JS开发常用工具函数(小结)
2019/07/04 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
[01:14]3.19DOTA2发布会 三代刀塔人第二代
2014/03/25 DOTA
python基础教程之元组操作使用详解
2014/03/25 Python
python如何在终端里面显示一张图片
2016/08/17 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
对python中的装包与解包实例详解
2019/08/24 Python
Python基于pyjnius库实现访问java类
2020/07/31 Python
Python Flask异步发送邮件实现方法解析
2020/08/01 Python
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
在校学生职业规划范文
2014/01/08 职场文书
学生周末长期请假条
2014/02/15 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
2014年企业团支部工作总结
2014/12/10 职场文书
巾帼文明岗汇报材料
2014/12/24 职场文书
辩护词格式
2015/05/22 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书