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 ...
随机推荐
- BZOJ1212——L语言
题目大意:每一个字符串都可以分解成一些个单词组成,现在给你一些单词,再给你一个字符串, dp吧,设f[i]为从0开始,到i结束的字符串前缀是否可以被分解,因为单词长度很小,所以,这就T了, (什么逻辑 ...
- << CocoaPods安装和使用教程 >>github code4app以及cocoachina 苹果官方文档
developer.apple.com 英文搜索各个技术的官方介绍文档, 前提是英文过关 cocoachina ios最新新闻, 信息 code4app上有许多组件 http://www.code4a ...
- thinkphp加载第三方类库
http://www.cnblogs.com/jiqing9006/p/5041389.html
- cocos2d内存管理
设想如下场景, 这是一个典型的内存合理分配的场景: 在一帧内, 有若干个函数, 每个函数都会创建一系列的精灵, 每个精灵都不同, 都会占用一定的内存, 精灵的总数可能会有1000个, 而一个函数只会创 ...
- Oracle中的null
测试数据:公司部分员工基本信息
- 160809212田京诚C语言程序设计实验2 选择结构程序设计_进阶
实验2-6 猜数字游戏 实验要求: 编写一个C程序实现一个[1-100]以内的猜数字游戏. (1) 系统随机产生一个[1-100]之间的随机数. (2) 输入任意一个数字.数字 ...
- 剑指Offer 用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路: 入队:将元素进栈A 出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进 ...
- FTP 传输中的主动模式和被动模式
最近做一个项目用到FTP和其它系统进行文件传输,结果在FTP网络连接的问题上花了很多时间,由于太久没搞多FTP,忘记了FTP不单单开放21端口,客户端采用不同连接模式对网络有不同.在此重温一下FTP的 ...
- CCF 模拟E DFS深搜
http://115.28.138.223:81/view.page?opid=5 这道题问的很怪. 起点DFS,每一个点还要DFS一次,统计不能到终点的个数 数据量不大这样做也能AC #includ ...
- PyQt4控件失去焦点和获得焦点
#QListView控件多选设置self.ui.listView.setSelectionMode(QAbstractItemView.ExtendedSelection) #初始化QListView ...