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 相关文章推荐
网页图片延时加载的js代码
Apr 22 Javascript
基于Jquery的动态添加控件并取值的实现代码
Sep 24 Javascript
javascript 手动给表增加数据的小例子
Jul 10 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
May 05 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
Feb 14 Javascript
vue2.0嵌套路由实现豆瓣电影分页功能(附demo)
Mar 13 Javascript
AngularJS中的promise用法分析
May 19 Javascript
jQuery 表单序列化实例代码
Jun 11 jQuery
jQuery自定义多选下拉框效果
Jun 19 jQuery
vue-cli系列之vue-cli-service整体架构浅析
Jan 14 Javascript
vue项目前端错误收集之sentry教程详解
May 27 Javascript
通过Kettle自定义jar包供javascript使用
Jan 29 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
QueryPath PHP 中的jQuery
2010/04/11 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
php实现RSA加密类实例
2015/03/26 PHP
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
不用写JS也能使用EXTJS视频演示
2008/12/29 Javascript
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
Javascript 刷新全集常用代码
2009/11/22 Javascript
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
淘宝搜索框效果实现分析
2011/03/05 Javascript
详解JavaScript中undefined与null的区别
2014/03/29 Javascript
JS实现控制表格行文本对齐的方法
2015/03/30 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
2015/04/15 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
2016/05/25 Javascript
JS中with的替代方法与String中的正则方法详解
2016/12/23 Javascript
基于jQuery实现定位导航位置效果
2017/11/15 jQuery
vue脚手架及vue-router基本使用
2018/04/09 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
viewer.js实现图片预览功能
2020/06/24 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
[44:21]Ti4 循环赛第四日 附加赛NEWBEE vs LGD
2014/07/13 DOTA
python实现俄罗斯方块
2018/06/26 Python
Python中字符串与编码示例代码
2019/05/20 Python
如何运行.ipynb文件的图文讲解
2019/06/27 Python
Django中celery执行任务结果的保存方法
2019/07/12 Python
python怎么判断模块安装完成
2020/06/19 Python
python安装cx_Oracle和wxPython的方法
2020/09/14 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
请写一个C函数,若处理器是Big_endian的,则返回0;若是Little_endian的,则返回1
2015/07/16 面试题
我的动漫时代的创业计划书范文
2014/01/27 职场文书
政府班子四风问题整改措施
2014/10/04 职场文书
十八大宣传标语
2014/10/09 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
pytorch显存一直变大的解决方案
2021/04/08 Python
JS实现九宫格拼图游戏
2022/06/28 Javascript