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 相关文章推荐
dess中一个简单的多路委托的实现
Jul 20 Javascript
extjs实现选择多表自定义查询功能 前台部分(ext源码)
Dec 20 Javascript
用JavaScript实现动画效果的方法
Jul 20 Javascript
js导出txt示例代码
Jan 14 Javascript
JS调试必备的5个debug技巧
Mar 07 Javascript
用JavaScript和jQuery实现瀑布流
Mar 19 Javascript
Bootstrap table使用方法记录
Aug 23 Javascript
轻松理解vue的双向数据绑定问题
Oct 30 Javascript
vue cli升级webapck4总结
Apr 04 Javascript
windows实现npm和cnpm安装步骤
Oct 24 Javascript
js实现全选和全不选
Jul 28 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
Oct 29 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实现两个数组相加的方法
2015/02/17 PHP
PHP递归遍历指定目录的文件并统计文件数量的方法
2015/03/24 PHP
FastCGI 进程意外退出造成500错误
2015/07/26 PHP
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
javascript 二分法(数组array)
2010/04/24 Javascript
JQuery中对Select的option项的添加、删除、取值
2013/08/25 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
javascript实现全角与半角字符的转换
2015/01/07 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
JavaScript创建对象的方式小结(4种方式)
2015/12/17 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
JS请求servlet功能示例
2017/06/01 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
Python数据结构之Array用法实例
2014/10/09 Python
Python os模块学习笔记
2015/06/21 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
2017/08/31 Python
Python 高级专用类方法的实例详解
2017/09/11 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
django 微信网页授权认证api的步骤详解
2019/07/30 Python
利用Python检测URL状态
2019/07/31 Python
Python中使用gflags实例及原理解析
2019/12/13 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
python如何绘制疫情图
2020/09/16 Python
python 第三方库paramiko的常用方式
2021/02/20 Python
德国圣伯纳德草药屋:Kräuterhaus Sanct Bernhard(有中文站)
2018/08/05 全球购物
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
2014年圣诞节促销方案
2014/03/14 职场文书
校庆接待方案
2014/03/18 职场文书
2015年小学开学寄语
2015/02/27 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书