JavaScript创建对象方法实例小结


Posted in Javascript onSeptember 03, 2018

本文实例讲述了JavaScript创建对象方法。分享给大家供大家参考,具体如下:

最简单的方式就是创建一个Object对象,并为其添加属性和方法。

//示例代码
var person=new Object()
person.name="yumi"
person.age=18
person.job="coder"
person.sayName=function(){
  alert(this.name)
}
person.sayName()//输出yumi

这种方式使用同一个接口创建多个对象,会出现大量重复代码。

1.工厂模式

JavaScript中无法创建类,我们可以用函数来封装以特定接口创建对象的细节。

//示例代码
function createPerson(name,age,job){
  var o=new Object();
  o.name=name;
  o.age=age;
  o.job=job;
  o.sayName=function(){
    alert(this.name)
  };
  return o;
}
var person1=createPerson("yumi",18,"coder");
var person2=createPerson("echo",21,"player");
person1.sayName();//输出yumi
person2.sayName();//输出echo

工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别问题,即怎样知道一个对象的类型。

2.构造函数模式

可以创建自定义的构**造函数,从而定义自定义对象类型的属性和方法。

//示例代码
function Person(name,age,job){
  this.name=name;
  this.age=age;
  this.job=job;
  this.sayName=function(){
    alert(name);
  }
}
var person1=new Person("yumi",18,"coder");
var person2=new Person("echo",21,"player");
person1.sayName();//输出yumi
person2.sayName();//输出echo

创建出的对象既是Object的实例,也是Person的实例,也就是说将来我们可以将它的实例标识为特定类型,这也是优于工厂模式的地方。但是构造函数模式也有缺点,即就是每实例化一个对象,对象方法都会创建一遍,我们可以按如下方法稍加改进:

//示例代码
function Person(name,age,job){
  this.name=name;
  this.age=age;
  this.job=job;
  this.sayName=sayName;
}
function sayName(){
  alert(name);
}
var person1=new Person("yumi",18,"coder");
var person2=new Person("echo",21,"player");
person1.sayName();
person2.sayName();

将函数拿到构造函数外部,构造函数内部将sayName属性设成全局sayName函数(一般单独的函数名存放的是指向该函数的指针,而函数名加括号为该函数的执行结果)。但这样做,暴露出的问题是:全局作用域中定义的函数只能被某一个对象调用,不符合全局定义了。而且,如果某个对象有很多方法,这些方法都定义在全局作用域的话,也就没什么封装性可言了。

3.原型模式

前面我们说了,构造函数模式的缺点是属性或方法在构造函数作用域中只能被某个对象调用,想想我们在其他面向对象语言中的处理方式,是将公用的属性方法定义在父类中,然后通过继承父类调用。但是JavaScript中不存在类、继承这些概念,而是通过原型链实现“继承”。

下面就是我们要说的原型模式:

//示例代码
function Person(){
  Person.prototype.name"yumi";
  Person.prototype.age=18;
  Person.prototype.job=coder;
  Person.prototype.sayName=function(){
    alert(name);
  }
}
var person1=new Person();
var person2=new Person();
person1.sayName();  //"yumi"
person2.sayName();  //"yumi"
alert(person1.sayName==person2.sayName);  //true

无论什么时候,只要创建了一个新函数,就会为该函数创建一个prototype属性。默认情况下,所有prototype属性都会自动获得一个constructor(构造函数)属性。这个属性包含一个指向prototype属性所在函数的指针。也就是说,Person可以理解为一个类(实际是个函数),Person.prototype指向原型(原型中定义的方法或属性可以被对象调用,相当于一个共享区域),然后Person.prototype.constructor又指向了Person。实例化的对象有一个内部属性可以指向Person.prototype,但是不能指向构造函数constructor,跟其无关。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行结果。

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
extjs中grid中嵌入动态combobox的应用
Jan 01 Javascript
用JS控制回车事件的代码
Feb 20 Javascript
JavaScript设计模式之代理模式介绍
Dec 28 Javascript
jQuery事件对象总结
Oct 17 Javascript
jQuery控制控件文本的长度的操作方法
Dec 05 Javascript
vue-router 学习快速入门
Mar 01 Javascript
Parcel.js + Vue 2.x 极速零配置打包体验教程
Dec 24 Javascript
vuejs实现折叠面板展开收缩动画效果
Sep 06 Javascript
基于mpvue的简单弹窗组件mptoast使用详解
Aug 02 Javascript
浅谈layui框架自带分页和表格重载的接口解析问题
Sep 11 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
Aug 04 Javascript
Vue基于iview table展示图片实现点击放大
Aug 05 Javascript
vue自定义底部导航栏Tabbar的实现代码
Sep 03 #Javascript
解决vue单页路由跳转后scrollTop的问题
Sep 03 #Javascript
webpack4 SCSS提取和懒加载的示例
Sep 03 #Javascript
vue自定v-model实现表单数据双向绑定问题
Sep 03 #Javascript
详解vue-cli下ESlint 配置说明
Sep 03 #Javascript
解决vue的 v-for 循环中图片加载路径问题
Sep 03 #Javascript
Vue实现底部侧边工具栏的实例代码
Sep 03 #Javascript
You might like
PHP中设置时区,记录日志文件的实现代码
2013/01/07 PHP
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
php支付宝手机网页支付类实例
2015/03/04 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
Laravel框架数据库迁移操作实例详解
2020/04/06 PHP
用JavaScript 处理 URL 的两个函数代码
2007/08/13 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
2015/10/16 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
JavaScript数据结构中串的表示与应用实例
2017/04/12 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
JS简单生成由字母数字组合随机字符串示例
2018/05/25 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
使用element-ui table expand展开行实现手风琴效果
2019/03/15 Javascript
JS面向对象之多选框实现
2020/01/17 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
python3图片转换二进制存入mysql
2013/12/06 Python
python数据处理实战(必看篇)
2017/06/11 Python
python查看模块,对象的函数方法
2018/10/16 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
快速查找Python安装路径方法
2020/02/06 Python
python3.9实现pyinstaller打包python文件成exe
2020/12/13 Python
css3一个简易的 LED 数字时钟实现方法
2020/01/15 HTML / CSS
南威尔士家居商店:Leekes
2016/10/25 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
毕业自荐书
2013/12/09 职场文书
党员自我批评与反省材料
2014/02/10 职场文书
销售队伍口号
2014/06/11 职场文书
2014企业年终工作总结
2014/12/23 职场文书
酒店温馨提示语
2015/07/14 职场文书
Python if else条件语句形式详解
2022/03/24 Python
详解Python flask的前后端交互
2022/03/31 Python