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 相关文章推荐
在Z-Blog中运行代码[html][/html](纯JS版)
Mar 25 Javascript
JavaScript判断DOM何时加载完毕的技巧
Nov 11 Javascript
JS 有趣的eval优化输入验证实例代码
Sep 22 Javascript
利用javascript实现全部删或清空所选的操作
May 27 Javascript
简单理解vue中el、template、replace元素
Oct 27 Javascript
jQuery 如何实现一个滑动按钮开关
Dec 01 Javascript
修改ligerui 默认确认按钮的方法
Dec 27 Javascript
详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
Mar 08 Javascript
基于Vue实现tab栏切换内容不断实时刷新数据功能
Apr 13 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
Apr 27 jQuery
vue观察模式浅析
Sep 25 Javascript
Angular value与ngValue区别详解
Nov 27 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
PHP 防注入函数(格式化数据)
2011/08/08 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
ThinkPHP中redirect用法分析
2014/12/05 PHP
PHP的pcntl多进程用法实例
2015/03/19 PHP
PHP关键特性之命名空间实例详解
2017/05/06 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
php实现微信分享朋友链接功能
2019/02/18 PHP
js 调整select 位置的函数
2008/02/21 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
javascript中的void运算符语法及使用介绍
2013/03/10 Javascript
利用NodeJS的子进程(child_process)调用系统命令的方法分享
2013/06/05 NodeJs
js中parseInt函数浅谈
2013/07/31 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
控制input输入框中提示信息的显示和隐藏的方法
2014/02/12 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
javascript实现table单元格点击展开隐藏效果(实例代码)
2017/04/10 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
three.js 入门案例详解
2018/01/23 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
python2与python3中关于对NaN类型数据的判断和转换方法
2018/10/30 Python
python json.loads兼容单引号数据的方法
2018/12/19 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
浅谈pytorch torch.backends.cudnn设置作用
2020/02/20 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
"引用"与多态的关系
2013/02/01 面试题
《风筝》教学反思
2014/04/10 职场文书
《槐乡五月》教学反思
2014/04/25 职场文书
html+css实现滚动到元素位置显示加载动画效果
2021/08/02 HTML / CSS