第二篇 使用对象和属性
用点记法或括号法获取/设置/更新对象的属性
点记法相对括号法更常用一些,但是有时候只能用括号法,点记法用不了。
如:1.如果你想操作的对象属性名被储存在一个变量内。
var foobarObject = {foobar: 'Foobar is code for no code'};
var string1 = 'foo';
var string2 = 'bar';
console.log(foobarObject[string1 + string2]);
2.属性名是无效标识符时。
var myObject = {'123':'zero','class':'foo'};
// Let's see dot notation do this! Keep in mind 'class' is a keyword in JavaScript
console.log(myObject['123'], myObject['class']); // logs 'zero foo'
删除对象属性
delete 操作是唯一可以彻底删除对象的某一属性。
var foo = {bar: 'bar'};
delete foo.bar;
console.log('bar' in foo); // logs false, because bar was deleted from foo
注: delete操作不可以删除在prototype链中的属性。
对象属性的引用方法
如果你想获取一个对象属性,而这个对象并不包含这个属性,那么js会在prototype链中去找这个属性。首先它会先查找创建这个对象的构造函数,检查它的prototype,看是否存在。如果还找不到,就会继续沿着prototype链查找构建这个构造函数的构造函数,直到找到该属性或链的尽头。
因为所有prototype属性都是对象,链的尽头是Object.prototype.
hasOwnProperty 判别一个对象属性是否从prototype链继承
hasOwnProperty 只查找对象本身的属性,不查找prototype链。
in 操作判断对象是否存在某属性
in 操作不仅查找对象本身,还会查找prototype链。
列举对象属性
用for in 可以列举对象的属性。
var cody = {
age : 23,
gender : 'male'
};
for (var key in cody) { // key is a variable used to represent each property name
// avoid properties inherited from the prototype chain
if(cody.hasOwnProperty(key)) {
console.log(key); }
}
注:1. for in 返回的不仅是对象的属性,还会包含从pprototype链继承的属性。如果想单纯获取对象属性,则必须用hasOwnProperty方法。
2.获取的属性的顺序并不一定和定义时的顺序一致。
3.只返回可枚举的属性,可以用propertyIsEnumberable()判断属性是可枚举的。
宿主对象(Host Objects)与原生对象(Native Objects)
执行js脚本的环境(如浏览器)本身包含的对象叫宿主对象。宿主对象并不属于脚本语言的一部分,但是在执行时可以被调用。宿主对象的属性和方法完全取决于环境。
在浏览器中,window/head 以及它们包含的对象(除了js提供的对象)都是宿主对象。最常见的宿主对象还有操作DOM的接口window.document.
执行js的环境会提供保存js原生对象的宿主对象。