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 ...
随机推荐
- CSS3圆角边框的使用-遁地龙卷风
0.快速入门 border-radius:50px; 1.border-radius详解 border-radius:50px; 上右下左,水平和垂直距离都是50px border-radius:50 ...
- java中重载与重写的区别
(1) 方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型. 重载Overloading是一个类中多态性的一种表现. 然后我们再来谈谈 重写(Over ...
- Effective Java 读书笔记之四 泛型
泛型的本质是参数化类型.只对编译器有效. 一.请不要在新代码中使用原生态类型 1.泛型类和接口统称为泛型,有一个对应的原生态类型. 2.原生类型的存在是为了移植兼容性. 3.无限制通配类型和原生态类型 ...
- Android学习笔记(二十一)——实战:程序数据共享
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 我们继续在Database项目的基础上继续开发,通过内容提供器来给它加入外部访问接口.首先将 MyDataba ...
- TP框架自动加载优先级
$map = array('Think\Log'=>THINK_PATH.'Think\Log.php','Org\Util\Array'=>THINK_PATH.'Org\Util\Ar ...
- Struts2中关于"There is no Action mapped for namespace / and action name"的总结
今天在调试一个基础的Struts2框架小程序.总是提示"There is no Action mapped for namespace / and action name"的错误. ...
- Tomcat启动服务报错:Unknown version string [3.1]. Default version will be used.
用Intellij IDEA 部署Web项目,Tomcat启动后报错Unknown version string [3.1]. Default version will be used. 作者的问题出 ...
- Oracle11g +Win 64+PLSQL9.0
最近在Oracle11g配置数据库的时候发现了一个问题,就是找不到监听,网上说win7的64位的系统必须装上32位的客户端才能被PLSQL 识别,事实上也是这样,PLSQL 只能识别32位的客户端,所 ...
- Hexo
Hexo Hexo is a fast, simple & powerful blog framework powered by Node.js.
- MySQL ODBC for Linux
参考自http://blog.csdn.net/allens_zhou/article/details/8575400 centos7 64bit [IP:192.168.0.100] yum ins ...