javascript创建对象的3种方法


Posted in Javascript onNovember 02, 2016

本文为大家分享了js创建对象的多种方法,分享个方法的优劣,具体内容如下

第一种创建对象的方式:

创建JSON对象
推荐使用的场合: 作为函数的参数,临时只用一次的场景。比如设置函数原型对象。

var object = {
  name: "Eric",
  age: 24,
  sayHi: function(){
   console.log("My name is "+ this.name + " this year is " + this.age + "years old.")
  }
 };

第二种创建对象的方式:

创建一个Object对象

var object = new Object();
 object.name = "Eric";
 object.age = 24;
 object.sayHi = function(){....};

以上两种创建对象方式的缺点:不能作为对象创建的模板,也就是不能用new进行构造新对象。

第三种创建对象的方式:

function Person() {
  this.name = "Eric";
  this.age = 24;
  this.sayHi = function(){
   console.log(this.name);
  }
 }

 var object1 = new Person();
 var object2 = new Person();

这种创建对象方式解决了前两种方式的缺点,可以作为对象创建的模板,可以一直复用创建出多个对象。

new运算符的作用:

执行构造函数(new后面的那个函数),在构造函数内部创建一个空对象
把上一部创建的空对象跟构造函数的原型对象进行关联
然后把this指向当前空对象
在构造函数执行结束后,如果没有return,把空对象返回给object

new运算符原理

第三种方式有个缺点: 对象的内部的函数会在每个对象中都存一份如果创建的对象非常多的话,那么非常浪费内存。函数的行为是所有对象可以共有,不需要每个对象都保存一份。所以,可以把函数放到原型中进行声明,那么所有对象都有了公共的函数,而且内存中只保留一份。所有的属性写到对象的内部

第三种方式beta1:

function Person() {
  this.name = 'Eric';
  this.age = 24;
 }
 Person.prototype = {
  sayHi: function() {
  },
 };

 var object1 = new Person();
 var object2 = new Person();

继续升级 beta2 :

function Person(name,age) {
  this.name = name || "";
  this.age = age || "";
 }
 Person.prototype = {
  sayHi: function() {
  },
 };

 var object1 = new Person(name1,age1);
 var object2 = new Person(name2,age2);

问题:1、调用者如果传递参数的顺序发生变化,那么废了
问题:2、参数增减都会导致函数声明变化,调用的地方也可能发生变化。

如何解决:继续升级 beta3 :

function Person(option) { //用一个对象把所有参数覆盖
  this.name = option.name || "";
  this.age = option.age || "";
 }
 Person.prototype = {
  sayHi: function() {
  },
 };

 var object1 = new Person({
   name: "Eric",
   age: 24
  });
 var object2 = new Person({
   name: "XXX",
   age: xx
  });

继续优化,把初始化的代码 放到init函数中

继续升级 beta4 :

function Person(option) {
  this._init(option);
 }
 Person.prototype = {
  _init: function (option){
   this.name = option.name;
   this.age = option.age;
  },
  sayHi: function(){
   console.log("HI");
  }
 };

 var object1 = new Person({
   name: "Eric";
   age: 24
  });
 object1.sayHi();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery.boxy插件的iframe扩展代码
Jul 02 Javascript
仅IE9/10同时支持script元素的onload和onreadystatechange事件分析
Apr 27 Javascript
在ASP.NET中使用JavaScript脚本的方法
Nov 12 Javascript
浅谈jQuery.easyui的datebox格式化时间
Jun 25 Javascript
js实现手机拍照上传功能
Jan 17 Javascript
jquery 实现复选框的全选操作实例代码
Jan 24 Javascript
mac上node.js环境的安装测试
Jul 03 Javascript
用js实现before和after伪类的样式修改的示例代码
Sep 07 Javascript
jQuery 操作 HTML 元素和属性的方法
Nov 12 jQuery
图片文字识别(OCR)插件Ocrad.js教程
Nov 26 Javascript
微信小程序时间选择插件使用详解
Dec 28 Javascript
JavaScript常用工具方法封装
Feb 12 Javascript
AngularJS入门教程之表单校验用法示例
Nov 02 #Javascript
JQuery Ajax WebService传递参数的简单实例
Nov 02 #Javascript
ASP.NET jquery ajax传递参数的实例
Nov 02 #Javascript
Javascript 正则表达式校验数字的简单实例
Nov 02 #Javascript
在JSP中如何实现MD5加密的方法
Nov 02 #Javascript
AngularJS入门教程之过滤器用法示例
Nov 02 #Javascript
JavaScript基础——使用Canvas绘图
Nov 02 #Javascript
You might like
一个简单的网页密码登陆php代码
2012/07/17 PHP
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
PHP实现统计代码行数小工具
2019/09/19 PHP
JavaScript实用技巧(一)
2010/08/16 Javascript
javascript插入样式实现代码
2012/02/22 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
ExtJS如何设置与获取radio控件的选取状态
2014/01/22 Javascript
解决json日期格式问题的3种方法
2014/02/02 Javascript
jQuery多个input求和的实现方法
2015/02/12 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
JavaScript实现弹出DIV层同时页面背景渐变成半透明效果
2016/03/25 Javascript
jQuery实现的放大镜效果示例
2016/09/13 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
vue resource post请求时遇到的坑
2017/10/19 Javascript
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
CryptoJS中AES实现前后端通用加解密技术
2018/12/18 Javascript
Python中集合类型(set)学习小结
2015/01/28 Python
Python之父谈Python的未来形式
2016/07/01 Python
浅析使用Python操作文件
2017/07/31 Python
浅谈python中的数字类型与处理工具
2017/08/02 Python
python三方库之requests的快速上手
2019/03/04 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
Python任务调度利器之APScheduler详解
2020/04/02 Python
Python实现简单的猜单词小游戏
2020/10/28 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
收银出纳员岗位职责
2014/02/23 职场文书
2016年万圣节活动总结
2016/04/05 职场文书
Python如何让字典保持有序排列
2022/04/29 Python
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python
MySQL生成千万测试数据以及遇到的问题
2022/08/05 MySQL