js对象
js中除数字、字符串、布尔值、null值、undefined之外都是对象。
对象是属性的容器,属性包含属性名和值,属性名可以是包括空字符串在内的任意字符串(个人想法还是使用js标识符好,省的麻烦),值可以是除undefined外任何值。
对象是class-free的,对新的属性键值没有限制。
对象可以套嵌,允许继承。
对象字面量:
对象字面量提供了非常方便创建新对象值得方法。
//空对象
var empty_object = {};
//多个键值对
var object1 = {
"first-name":"党兴明",
"last-name":"周林"
};
//可以套嵌
var object2 = {
first_name:"党兴明", //属性名是合法标识符可以不用引号
last_name:"周林",
another_obj1:{
time:"2016-11-09",
city:"hangzhou"
},
another_obj2{
home:"shengzhou"
}
};
检索:
要检索对象里包含的值可以用[] 或 .
优先考虑使用 .
object1["first-name"] //党兴明
//如果[]中是合法的js标识符,可以
object1.first_name; //党兴明
//object.first_name = "张三"; //如果你检索不存在的属性,会返回undefined
object1.second_name; //undefined
//运算符||可以用来填充默认值
var name = object1.first_name || "unknow" //尝试从undefined的属性中取值,会导致TypeError的错误,可以通过 && 运算符来解决
object1.equipment; //undefined
object1.equipment.model; //TypeError
object1.equipment && object.equipment.model; //undefined
引用:
对象通过引用来传递,他们永远不会被复制。
var stooge = {
first_name:"dangxingming",
last_name:"zhoulin"
}
var x = stooge;
x.nickname = "Curly";
var nick = stooge.nickname;
//因为x 和 stooge指向同一个对象的引用,所以nick为“Curly”
var a = {}, var b = {}, var c = {};
//a b c 都引用不同的空对象
var a = b = c = {};
//a b c 都引用同一个空对象
原型:
每个对象都链接到一个原型对象,并且可以从中继承属性。所有通过对象字面量创建的对象都连接到Object.prototype,它是js中的标配对象。
当你创建一个对象时,可以选择某个对象作为它的原型。我们将给Object增加一个create方法。这个方法创建一个使用原对象作为其原型的新对象。
委托:原型对象只有在检索值时才用到,当我们尝试去获取某对象的值时,但该对象没有该值,那么js就会试着从原型对象中获取属性值。如果再没有,继续向上追溯,直到到达终点Object.prototype。如果还没有,那就是undefined值。
var stooge = {
first_name:"dangxingming",
last_name:"zhoulin"
}
if(typeof Object.beget !=="function"){
Object.create = function(o){
var F = function (){};
F.prototype = o;
return new F();
};
}
var another_stooge = Object.create(stooge);
//当我们对某对象做出改变时,不会触及该对象的原型
another_stooge.first_name = "Harry";
stooge.first_name; //依然是dangxingming
//原型关系是一种动态关系,当我们添加一个新属性到原型中去时,该属性立即对所有基于该原型创建的对象可见
stooge.first_name = "zhangsan";
another_stooge.first_name;//也变成zhangsan
反射:
确定对象的属性类型,typeof操作符和hasOwnProperty()方法var object2 = {
first_name:"党兴明", //属性名是合法标识符可以不用引号
last_name:"林",
another_obj1:{
time:"2016-11-09",
city:"hangzhou"
},
another_obj2{
home:"shengzhou"
}
};
//typeof
typeof object2.first_name; //string
typeof object2.another_obj1; //Object
//原型链中的任何属性都会产生值
typeof Object2.toString; //function
typeof Object2.constructor; //function
//hasOwnProperty,如果对象拥有独有属性,它将返回true,此方法不会检查原型链
object2.hasOwnProperty("first_name");//true
object2.hasOwnProperty("constructor");//false
枚举:
for in 语句可以用来遍历一个对象中的所有属性名。包括原型中的属性,可以通过hasOwnProperty方法,以及typeof来排除函数:
//for in属性名出现的顺序是不确定的
var name;
for(name in another_stooge){
if(typeof another_stooge.name !== "function"){
document.writeln(name + ":" + another_stooge.name);
}
}
删除:
delete运算符可以用来删除对象的属性。如果对象包含该属性,那么该属性就会被移除,它不会触及原型链中的任何对象。
删除对象的属性可能让原型链中的属性暴露出来another_stooge.nickname; //"Moe"
//删除another_stooge属性可能暴露出原型的nickname属性
delete another_stooge.nickname;
another_stooge.nickname; //"Curly"
减少全局变量污染:
最小化使用全局变量的方法是为应用只创建唯一一个全局变量:
var MYAPP = {};
该变量此时变成你的应用的容器:
var MYAPP = {};
MYAPP.stooge = {
first_name:"dangxingming",
last_name:"zhoul"
}
MYAPP.object2 = {
first_name:"党兴明", //属性名是合法标识符可以不用引号
last_name:"林",
another_obj1:{
time:"2016-11-09",
city:"hangzhou"
},
another_obj2{
home:"shengzhou"
}
};
只要把全局性资源纳入一个命名空间下,程序与其他程序、组件、类库发生冲突的可能性会显著降低。
并且更容易阅读,因为很明显MYAPP.stooge指向的是顶层结构。下一章的闭包来进行信息隐藏。
js对象的更多相关文章
- JS对象继承篇
JS对象继承篇 ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的 原型链 其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法 function Person() ...
- JS 对象封装的常用方式
JS是一门面向对象语言,其对象是用prototype属性来模拟的,下面,来看看如何封装JS对象. 常规封装 function Person (name,age,sex){ this.name = na ...
- JSON字符串和JS对象之间的转换
JSON字符串和JS对象之间的转换 1 json字符串转换为js对象 1.1 标准json格式字符串转换为Js对象 JSON字符串 str JSON.parse(str) eval(str) eva ...
- js 对象的_proto_
js 对象呢,有个属性叫_proto_,以前没听说过,也没关注,最近看这个原型,就被迫知道了这个东西,js 这里面的东西,真是规定的很奇怪,具体为啥也不知道,就测试发现的,对象的_proto_属性,和 ...
- js对象/数组深度复制
今天碰到个问题,js对象.数组深度复制:之前有见过类似的,不过没有实现函数复制,今晚想了一下,实现代码如下: function clone(obj) { var a; if(obj instanceo ...
- js对象的深度克隆
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js对象详解
js自定义对象 一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在J ...
- js对象常用2中构造方法
//js 对象的构造方法通常有2中情况: //第一种是通过json对象构造 var persion={ name:"孙悟空", age:40, eat:function () { ...
- JS对象复制
在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针.引用.地址之类的,所以直接用"="就可以把一个对象复制给另外一 ...
- js对象私有变量公有变量问题
0 js对象私有变量公有变量问题5 小弟初学JS面向对象编程 现有一问题 请教各位大虾: Person=function (){ //私有变量定义 var name; vae age; var Ale ...
随机推荐
- BZOJ1012——[JSOI2008]最大数maxnumber
1.题目大意:求末尾L个数的最大值,强制在线 2.分析:这个拿线段树可以直接水过,然后我写了一个 维护单调栈, 二分求最大值的短代码,手懒.... #include <cstdio> #i ...
- iOS跳转到另一个程序
我这里只是写了部分东西,如果想看更加详细的,请点击原文链接. 原文链接:http://blog.csdn.net/likendsl/article/details/7553605 原则上iOS的沙 ...
- hiberante入门
Hibernate 目前企业级应用一般均采用面向对象的开发方法,而内存中的对象数据不能永久存在,如想借用关系数据库来永久保存这些数据的话,无疑就存在一个对象-关系的映射过程.在这种情形下,诞生了许多解 ...
- FTP 传输中的主动模式和被动模式
最近做一个项目用到FTP和其它系统进行文件传输,结果在FTP网络连接的问题上花了很多时间,由于太久没搞多FTP,忘记了FTP不单单开放21端口,客户端采用不同连接模式对网络有不同.在此重温一下FTP的 ...
- Mac之vim普通命令使用[转]
高级一些的编辑器,都会包含宏功能,vim当然不能缺少了,在vim中使用宏是非常方便的: :qx 开始记录宏,并将结果存入寄存器xq 退出记录模式@x 播放记录在x寄存器中的宏命 ...
- linux下编译qt5.6.0静态库——configure配置
linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...
- zabbix之MySQL数据库的安装
转载自:http://www.ttlsa.com/mysql/install-mysql5_6/ 启动MySQL并制定套接字 mysql -u user -ppassword -S 指定socket路 ...
- HTTP协议详解篇(待续)
1.工作流程 HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: (1)建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务 ...
- centos终端中mysql中文显示乱码的处理
http://stackoverflow.com/questions/3513773/change-mysql-default-character-set-to-utf-8-in-my-cnfhttp ...
- intellij Idea快捷键
CTRL+ALT+O 优化导入的类和包 Alt + Center 导入类,实现接口 CTRL+N 查找类CTRL+SHIFT+N 查找文件CTRL+SHIFT+ALT+N 查找类中的方法或变 ...