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 相关文章推荐
jquery 表格分页等操作实现代码(pagedown,pageup)
Apr 11 Javascript
jquery实现图片滚动效果的简单实例
Nov 23 Javascript
JS获取html对象的几种方式介绍
Dec 05 Javascript
深入学习JavaScript对象
Oct 13 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
Apr 03 Javascript
jQuery Mobile框架中的表单组件基础使用教程
May 17 Javascript
基于Bootstrap框架实现图片切换
Mar 10 Javascript
React简单介绍
May 24 Javascript
JavaScript常用数组操作方法,包含ES6方法
May 10 Javascript
Node.js操作系统OS模块用法分析
Jan 04 Javascript
vue-cli 3 全局过滤器的实例代码详解
Jun 03 Javascript
Node.js控制台彩色输出的方法与原理实例详解
Dec 01 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
php设计模式之单例模式使用示例
2014/01/20 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
2015/03/16 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
JS去除iframe滚动条的方法
2015/04/01 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
jQuery中$.grep() 过滤函数 数组过滤
2016/11/22 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
node.js入门学习之url模块
2017/02/25 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
详解VUE 数组更新
2017/12/16 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
jquery将信息遍历到界面上实例代码
2020/01/21 jQuery
toString.call()通用的判断数据类型方法示例
2020/08/28 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
2020/12/07 Javascript
js加减乘除精确运算方法实例代码
2021/01/17 Javascript
python学习之第三方包安装方法(两种方法)
2015/07/30 Python
Python 的描述符 descriptor详解
2016/02/27 Python
Python入门教程之运算符与控制流
2016/08/17 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
matplotlib实现热成像图colorbar和极坐标图的方法
2018/12/13 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
详解Python的三种拷贝方式
2020/02/11 Python
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
《我的第一本书》教学反思
2014/02/15 职场文书
学校消防演习方案
2014/02/19 职场文书
圣诞晚会主持词
2015/07/01 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书