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对象的更多相关文章

  1. JS对象继承篇

    JS对象继承篇 ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的 原型链 其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法 function Person() ...

  2. JS 对象封装的常用方式

    JS是一门面向对象语言,其对象是用prototype属性来模拟的,下面,来看看如何封装JS对象. 常规封装 function Person (name,age,sex){ this.name = na ...

  3. JSON字符串和JS对象之间的转换

    JSON字符串和JS对象之间的转换 1 json字符串转换为js对象 1.1 标准json格式字符串转换为Js对象  JSON字符串 str JSON.parse(str) eval(str) eva ...

  4. js 对象的_proto_

    js 对象呢,有个属性叫_proto_,以前没听说过,也没关注,最近看这个原型,就被迫知道了这个东西,js 这里面的东西,真是规定的很奇怪,具体为啥也不知道,就测试发现的,对象的_proto_属性,和 ...

  5. js对象/数组深度复制

    今天碰到个问题,js对象.数组深度复制:之前有见过类似的,不过没有实现函数复制,今晚想了一下,实现代码如下: function clone(obj) { var a; if(obj instanceo ...

  6. js对象的深度克隆

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. js对象详解

    js自定义对象 一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtable类等等. 目前在J ...

  8. js对象常用2中构造方法

    //js 对象的构造方法通常有2中情况: //第一种是通过json对象构造 var persion={ name:"孙悟空", age:40, eat:function () { ...

  9. JS对象复制

    在JavaScript很多人复制一个对象的时候都是直接用"=",因为大家都觉得脚本语言是没有指针.引用.地址之类的,所以直接用"="就可以把一个对象复制给另外一 ...

  10. js对象私有变量公有变量问题

    0 js对象私有变量公有变量问题5 小弟初学JS面向对象编程 现有一问题 请教各位大虾: Person=function (){ //私有变量定义 var name; vae age; var Ale ...

随机推荐

  1. phpcms标签云

    {pc:get sql="SELECT keyword FROM v9_keyword WHERE siteid=$siteid AND searchnums > 5 ORDER BY ...

  2. MongoDB的学习和使用

    一.下载mongodb. 官网下载, 或者http://www.360sdn.com/opensource-datasource/2015/0403/5584.html下载: http://fastd ...

  3. 分布式系统一致性算法 raft学习

    在学习MongoDB的过程中,有博客中写道其搭建复制集时使用了raft算法,经过简单地的搜索资料后,发现了一个特别好的网站资料.这个网站用动画的形式,非常清楚和详尽的解释了整个raft算法的精要和过程 ...

  4. Effective Java 读书笔记之十 序列化

    一.谨慎地实现Serializable接口 1.一旦一个类被发布,就大大地降低了“改变这个类的实现”的灵活性. 2.仔细设计类的序列化形式而不是接受类的默认虚拟化形式. 3.反序列化机制是一个“隐藏的 ...

  5. SSH-Struts第三弹:传智播客视频教程第一天上午的笔记

    一. 框架概述1.三大框架 : 是企业主流 JavaEE 开发的一套架构 Struts2 + Spring + Hibernate 2. 什么是框架?为什么要学框架 ?框架 是 实现部分功能的代码 ( ...

  6. 27 GroupSock概述(一)——live555源码阅读(四)网络

    27 GroupSock概述(一)——live555源码阅读(四)网络 27 GroupSock概述(一)——live555源码阅读(四)网络 简介 1.网络通用数据类型定义 2.Tunnel隧道封装 ...

  7. 应用HTK搭建语音拨号系统1:数据准备

    选自:http://maotong.blog.hexun.com/6204849_d.html 应用HTK搭建语音拨号系统--数据准备 苏统华 哈尔滨工业大学人工智能研究室 2006年10月30日 声 ...

  8. 【云计算】docker相关开源项目、工具

    十大基于Docker的开发工具 作者                     郭蕾        发布于     2014年8月19日     |              注意:QCon全球软件开发 ...

  9. poj 1572

    一道字符串替换的题目. 题意:给你2*n组字符串,一个是规则,一个是替换的结果. 字符串的题目,确实麻烦,有些细节不处理好就是wa. 这里我提供1组数据 intput 1 abcdef a abcde ...

  10. Unity全屏模糊

    先上效果,左边模糊 其实用的是Unity Stard Effect里的资源,一个脚本一个shader //脚本代码 using UnityEngine; using System.Collection ...