第二章 对象与属性

2.1 复杂对象可以将大多数JavaScript值作为属性

var myObject = {};
myObject.myFunction = function(){};
myObject.myArray = [];
myObject.myString = "string";
myObject.myNumber = 33;
myObject.myDate = new Date();
myObject.myRegExp = /a/;

2,2 封装复杂对象

//使用对象封装,创建对象链
var object1 = {
    object1_1:{
        object1_1_1:{foo:'nar'},
        object1_1_2:{},
    },
    object1_2:{
        object1_2_1:{},
        object1_2_2:{},
    },
};
console.log(object1.object1_1.object1_1_1.foo);
//可以无限制扩展
var foo = [{foo:[bar:{say:function(){return 'hi';}}]}];
console.log(foo[0].foo[0].bar.say());

2.3 用点表示法或中括号表示法获取/设置/更新对象属性

var liuy = new Object();
liuy.living = true;
console.log(liuy.living);
//Document.write(liuy.living);
liuy['living'] = false;
console.log(liuy['living']);
var foobarObject = {foobar:'Foober is code for no code'};
var string1 = "foo";
var string2 = "bar";
console.log(foobarObject[string1 + string2]);   //woo!!!

此外,在属性名称为JavaScript无效标识符的时候,中括号表示法可以派上用场。

var myObject = {'123': 'zero', 'class': 'foo'};

2.4 删除对象属性

delete操作符可以将属性从一个对象中完全删除。
delete liuy.living;

! delete是将属性重对象中删除的唯一方法。将属性设置为undefined或null只能改变属性的值,而不会将属性从对象中删除。

2.5 如何解决对象属性的引用

当试图访问一个对象的属性时,它会检查该属性的对象实例。
如果实例拥有属性,将返回属性的值,而且不会有继承发生,因为没有利用原型链;
如果实例没有属性值,JavaScript会在对象的构造函数,特别是实例构造函数的prototype(原型)属性。

   var myArray = [];
console.log(myArray.foo);
myArray = ['foo','bar'];
console.log(myArray.join());
console.log(myArray.hasOwnProperty('join'));

再次重申一下,如果你试图访问一个属性,但该对象不包含该属性时,JavaScript将针对这个值搜索原型链。
首先,它将查看创建对象(如Array)的构造函数,并校验器原型(Array.prototype),了解是否可以在这里找到这些属性。如果第一个原型对象没有该属性,那么JavaScript将继续搜索初始构造函数背后(父类)的构造函数链,一直搜索到链的末端(Object)。

2.6 使用 hasOwnProperty 验证对象属性不是来自原型链

var myObject = {foo:'value'};
console.log(myObject.hasOwnProperty('foo'));
console.log(myObject.hasOwnProperty('toLocalString'));
console.log('foo' in myObject);
console.log('toString' in myObject);

2.7 使用 in 操作符检查一个对象是否包含给定属性

需要了解的是,in操作符不仅能检查包含在引用的对象的中的属性,而且能够检查对象通过原型链结成的属性。因此,属性查找规则是一样的,并且,如果在当前对象中找不到属性,就会在原型链上进行搜索。

2.8 使用 for in 循环枚举(遍历)对象的属性

! 访问属性的顺序并不总是他们在循环内部被定义的顺序。另外,定义属性的顺序不一定是访问他们的顺序。
使用 for in 循环只能遍历可枚举属性,例如构造函数属性就不会显示,可以使用 propertyIsEnumerable()方法检查哪些属性是可枚举属性。

2.9 宿主对象与原生对象

大家应该利艾姐的是,执行JavaScript的环境(如Web浏览器)通常包含宿主对象。
宿主对象不是ECMAScript实现的一部分,但在执行时可作为对象使用。当然,宿主对象的可用性和行为完全取决于宿主环境提供的内容。

2.10 使用Underscore.js增强及扩展对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值