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 相关文章推荐
User Scripts: Video Download by User Scripts
May 14 Javascript
javascript qq右下角滑出窗口 sheyMsg
Mar 21 Javascript
解析JavaScript中delete操作符不能删除的对象
Dec 03 Javascript
如何利用AngularJS打造一款简单Web应用
Dec 05 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
Jun 06 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
Oct 10 Javascript
JS二叉树的简单实现方法示例
Apr 05 Javascript
浅析JS中常用类型转换及运算符表达式
Jul 23 Javascript
解决option标签selected="selected"属性失效的问题
Nov 06 Javascript
fullpage.js最后一屏滚动方式
Feb 06 Javascript
基于vue实现圆形菜单栏组件
Jul 05 Javascript
微信js-sdk 录音功能的示例代码
Nov 01 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
Banner程序
2006/10/09 PHP
PHP静态类
2006/11/25 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
php set_time_limit()函数的使用详解
2013/06/05 PHP
查找php配置文件php.ini所在路径的二种方法
2014/05/26 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
Javascript 入门基础学习
2010/03/10 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
详解JSON1:使用TSQL查询数据和更新JSON数据
2016/11/21 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
JavaScript表单验证完美代码
2017/03/02 Javascript
[09:43]DOTA2每周TOP10 精彩击杀集锦vol.5
2014/06/25 DOTA
Linux环境下MySQL-python安装过程分享
2015/02/02 Python
pymongo为mongodb数据库添加索引的方法
2015/05/11 Python
Python中用sleep()方法操作时间的教程
2015/05/22 Python
在win和Linux系统中python命令行运行的不同
2016/07/03 Python
python使用turtle库绘制时钟
2020/03/25 Python
python实现弹跳小球
2019/05/13 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
解决Jupyter因卸载重装导致的问题修复
2020/04/10 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
Python如何将装饰器定义为类
2020/07/30 Python
用HTML5实现网站在windows8中贴靠的方法
2013/04/21 HTML / CSS
OnePlus加拿大官网:中国国际化手机品牌
2020/10/13 全球购物
什么是聚集索引和非聚集索引
2012/01/17 面试题
Solaris操作系统的线程机制
2015/07/28 面试题
应届大学生自荐信格式
2013/09/21 职场文书
物业经理求职自我评价
2013/09/22 职场文书
仓库管理专业个人的自我评价
2013/12/30 职场文书
新农村建设典型材料
2014/05/31 职场文书