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 相关文章推荐
javascript笔试题目附答案@20081025_jb51.net
Oct 26 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
Jan 01 Javascript
js 窗口抖动示例
Sep 04 Javascript
原始的js代码和jquery对比体会
Sep 10 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
Aug 22 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
Jan 30 Javascript
JavaScript简单实现鼠标移动切换图片的方法
Feb 23 Javascript
深入理解bootstrap框架之第二章整体架构
Oct 09 Javascript
Vue开发过程中遇到的疑惑知识点总结
Jan 20 Javascript
关于Sequelize连接查询时inlude中model和association的区别详解
Feb 27 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
Jan 18 Javascript
vue实现日历备忘录功能
Sep 24 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
Yii框架实现图片上传的方法详解
2017/05/20 PHP
$()JS小技巧
2007/07/21 Javascript
JavaScript开发时的五个注意事项
2007/12/08 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
jquery zTree异步加载简单实例讲解
2016/02/25 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
jquery仿苹果的时间/日期选择效果
2017/03/08 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
微信小程序实现顶部选项卡(swiper)
2020/06/19 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
Webpack4 使用Babel处理ES6语法的方法示例
2019/03/07 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
Element PageHeader页头的使用方法
2020/07/26 Javascript
python代码制作configure文件示例
2014/07/28 Python
Python格式化css文件的方法
2015/03/10 Python
python实现定时同步本机与北京时间的方法
2015/03/24 Python
Python+matplotlib实现计算两个信号的交叉谱密度实例
2018/01/08 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
Django Rest framework之权限的实现示例
2018/12/17 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
Python中itertools的用法详解
2020/02/07 Python
python如何删除文件、目录
2020/06/23 Python
运动鞋、足球鞋和慕尼黑球衣:Sport Münzinger
2019/08/26 全球购物
高中生学期学习自我评价
2014/02/24 职场文书
逃出克隆岛观后感
2015/06/09 职场文书
Pytorch DataLoader shuffle验证方式
2021/06/02 Python
Python包argparse模块常用方法
2021/06/04 Python
详解MySQL中的pid与socket
2021/06/15 MySQL
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis