js创建对象的方法汇总


Posted in Javascript onJanuary 07, 2016

js一个有三种方法创建对象,这里做一个总结.

1.对象直接量

所谓对象直接量,可以看做是一副映射表,这个方法也是最直接的一个方法,个人比较建议,

//创建简单对象
var obj1 = {}; //空对象

var obj2 = {
  name: "ys",
  age: 12
};
//创建复杂对象
var obj3 = {
  name: "ys",
  age: 12,
  like: {
    drink: "water",
    eat: "food"
  }
};

console.log(typeof obj1);  //object
console.log(typeof obj2);  //object
console.log(typeof obj3);  //object

有的人可能会发现,这里的键值名怎么没有引号”“,好细心,其实这个引号(单引双引号,js一样)加不加都行,但是个人建议加上,为什么能,因为加上之后,键值名可以很随意….当然如果你不乱定义名字的话,第一个比较好,因人而异,

var obj4 = {
  "my name": "ys",  //键值名中间有空格
  "my-age": 12,    //键值名中间有连字符
  "while": 111    //键值名是关键字
}

console.log(obj4['my name']);  //ys
console.log(obj4['my-age']);  //12
console.log(obj4.while);    //111
console.log(typeof obj3);    //object

通过上面的例子,大家可以看出”.”和”[]”访问属性的区别了吧

对象直接量创建的对象,键值对的值支持表达式,如下

var obj3 = {
  name: "ys",
  age: obj2.age,   //引用obj2.age
  like: {
    drink: "water",
    eat: "food"
  }
};

console.log(obj3.age); //100

2.new创建对象

1).系统内置对象

var obj1 = new Object();
var obj2 = new Array();
var obj3 = new Date();
var obj4 = new RegExp("ys");

console.log(typeof obj1);  //object
console.log(typeof obj2);  //object
console.log(typeof obj3);  //object
console.log(typeof obj4);  //object

2).自定义对象

function Person(name, age){
  this.name = name;
  this.age = age;
}

var obj1 = new Person("ys", 12);

console.log(Object.prototype.toString.call(obj1));  //object
console.log(Person instanceof Object);        //true
console.log(typeof obj1);              //object
console.log(obj1.age);                //12

3.Object.create()创建

该方法有两个参数,我就只解释下第一参数,第二个参数不常用(对对象的属性进行进一步描述)
第一个参数:传入要继承的原型(prototype)对象
怎样理解这句话呢?

var obj1 = Object.create({
  name: "ys",
  age: 12
});
console.log(obj1);     //{}
console.log(obj1.age);   //12

obj1为{},为什么可以访问到属性值呢?我们理解下第一个参数的意义“传入要继承的原型对象”

console.log(obj1.__proto__);  //Object {name: "ys", age: 12}

对象本身为空,但是原型链上数据不为空,存在obj1.age,所以可以访问到。

1).当第一个参数为null时

var obj2 = Object.create(null);   //不继承对象应有的属性和方法
console.log(obj2 + "abc");     //报错 ,失去 + 功能

为什么会报错呢?正常参数下生成的图如下:

js创建对象的方法汇总

通过图可以看出,要继承的原型对象(即参数)又继承了Object的原型对象,关键原因来了,Object的原型对象包含了一些js对象的基本方法(indexOf(),toString(),'+'功能……)而这个时候,如果参数为null,那么这条继承链就断了。

这个时候大家应该理解了一句话了吧,JavaScript中所有的对象都继承自Object,以为Object处于继承链的最顶端。

2).创建空对象

var obj3 = Object.create(Object.prototype); 
console.log(obj3);              //{},(空对象,与前两个方法 {},new Object 相同)
console.log(obj3.__proto__);         //如下图 ,只包含了基本对象的方法

代码的图:

js创建对象的方法汇总

这样创建的对象,只包含了对象的基本方法。

3).最后大家看下面的代码,希望能更深刻的理解Object.create()方法,大家可以参考这篇文章:《一种新的javascript对象创建方式Object.create()》

var obj1 = {
  name: "ys",
  age: 12
};
obj1.prototype = {
  sayName: function(){
    return console.log(this.name);
  }
};
/*①对象参数,只继承对象*/
var obj2 = Object.create(obj1);
console.log(obj2);                 //{}
console.log(obj2.name);               //ys
/*console.log(obj2.sayName());*/          /* 报错 obj2.sayName is not a function*/
console.log(obj2.__proto__.prototype.sayName());  //ys 理解原型的原型

如果不理解的话,看下面的图

js创建对象的方法汇总

/*②对象原型,继承对象原型*/
var obj3 = Object.create(obj1.prototype);
console.log(obj3);                 //{}
console.log(obj3.name);               //undefined,没有继承对象本身
obj3.name = "ys";
console.log(obj3.name);               //ys
console.log(obj3.sayName());            //ys

代码不理解看图(设置name后的图):

js创建对象的方法汇总

这个时候相信大家都理解第一个参数了吧。

以上就是本文的全部内容,希望可以帮助大家更好的创建对象。

Javascript 相关文章推荐
javascript for循环设法提高性能
Feb 24 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
Feb 27 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
Jul 01 Javascript
jquery中show()、hide()和toggle()用法实例
Jan 15 Javascript
JS实现六位字符密码输入器功能
Aug 19 Javascript
Angular2生命周期钩子函数的详细介绍
Jul 10 Javascript
vue组件学习教程
Sep 09 Javascript
vue获取当前点击的元素并传值的实例
Mar 09 Javascript
简单说说如何使用vue-router插件的方法
Apr 08 Javascript
vue组件之间的数据传递方法详解
Apr 19 Javascript
一篇文章带你浅入webpack的DLL优化打包
Feb 20 Javascript
bootstrap实现tab选项卡切换
Aug 09 Javascript
JavaScript截取、切割字符串的技巧
Jan 07 #Javascript
js确认框confirm()用法实例详解
Jan 07 #Javascript
实例讲解jquery与json的结合
Jan 07 #Javascript
javascript仿百度输入框提示自动下拉补全
Jan 07 #Javascript
基于jquery实现表格无刷新分页
Jan 07 #Javascript
js密码强度检测
Jan 07 #Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
Jan 07 #Javascript
You might like
正则表达式语法
2006/10/09 Javascript
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
基于laravel belongsTo使用详解
2019/10/18 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
FormValid0.5版本发布,带ajax自定义验证例子
2007/08/17 Javascript
摘自启点的main.js
2008/04/20 Javascript
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
jQuery取得select选择的文本与值的示例
2013/12/09 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
jQuery中过滤器的基本用法示例
2017/10/11 jQuery
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
pytorch对可变长度序列的处理方法详解
2018/12/08 Python
介绍一款python类型检查工具pyright(推荐)
2019/07/03 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
pytorch点乘与叉乘示例讲解
2019/12/27 Python
python模拟预测一下新型冠状病毒肺炎的数据
2020/02/01 Python
详解python 降级到3.6终极解决方案
2020/02/06 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
Python实现像awk一样分割字符串
2020/09/15 Python
HTML5 CSS3新的WEB标准和浏览器支持
2009/07/16 HTML / CSS
西班牙英格列斯百货法国官网:El Corte Inglés法国
2017/07/09 全球购物
西海岸男士和男童服装:Johnnie-O
2018/03/15 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
final, finally, finalize的区别
2012/03/01 面试题
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
2015年中学团委工作总结
2015/07/22 职场文书
高中数学教学反思范文
2016/02/18 职场文书
《植树问题》教学反思
2016/03/03 职场文书
Python中快速掌握Data Frame的常用操作
2021/03/31 Python
解决Go gorm踩过的坑
2021/04/30 Golang
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js
Linux下使用C语言代码搭建一个简单的HTTP服务器
2022/04/13 Servers