对象的操作
和别的数据类型不一样,我们通过引用来操作对象。这样说可能有点抽象,给个例子吧
var x = {name : 'Anna', age : 12}; var y = x; y.age = 22; console.log(x.age); -->22
因为y是对x对象的引用,所以对y的操作,会改变x的值。
对象属性的引用
.和[]都能够对对象的属性进行引用,那么他们有什么区别呢。给一段代码
var x ={name : 'Anna', age : 22}; console.log(x.name); -->Anna console.log(x['name']); -->Anna console.log(x['n'+'am'+'e']); -->Anna console.log(x[name]); ERROR!!
从上面可以看出来,用.对对象的属性进行引用的话,.后面接的是key值,而用[]对对象的属性进行引用的话,里面写的是计算结果为key的表达式。
这是因为,用.来引用对象的时候,是通过标识符来表示属性名字的,它是无法修改的。
但是用[]来引用对象的时候,是通过字符串来表示属性名字的,它是可以修改的。
我知道看到这里你一定会觉得很晕,没懂在讲什么。因为我也是这样,但是给个例子就知道啦。
var Good_friends = {}; var girls = [{id:1,name:小可},{id:2,name:阿呆}] for(var i = 0 ; i<girls.length ; i++){ Good_friens[girls[i].id] = girls[i]; }
这个例子表达的意思是,把对象girl取出来,作为对象的属性,存在Good_friends里面。写的明白些,应该是这样:
Good_friends = { 1:girls[0], 2:girls[1] }
里面每一个属性对应的值又是一个对象。
在这个例子里面可以充分体现出,用.和用[]来引用对象属性的区别。因为在这个例子里面根本不可能用.来引用对象的属性。(这也顺便介绍一下怎么给一个对象里面添加新的属性)
继承
对象里,有它自己的属性,也有从原型中继承的属性。举个栗子:
var o = {}; o.x = 1; var p = inherit(o); p.y = 2; var z = inherit(z); console.log(z.x*z.y); ->2
也就是说,如果我们要在对象中找他的一个叫做x的属性,若是这个对象里面没有x属性,那么,就会在该对象的原型中寻找x属性,若是它的原型中还是没有x属性,又去上一级原型中寻找,以此类推,直到查找到一个为null的原型。
属性的赋值:如果我们要对z.x进行赋值,那么首先会查看x属性是不是只读的,如果是,那么赋值失败。如果不是,那么会在对象x中创建一个属性x,然后对它进行赋值,并不会影响到原型中x的值。
delete运算符可以删除对象的属性,但是它只是断开对象属性和宿主之间的关系。
而且delete只能删除自有属性,不能删除继承属性。
删除一个不可配置的属性会报错。
检测属性
来判断一个属性是否存在于这个对象中,
一共有三个方法(只列了两个,还有一个我还没懂囧)
in运算符,hasOwnProperty()
o = {x:1}; 'x' in o; ->true hasOwnProperty('x'); ->true //检测自有属性
原型属性
对象的原型属性是用来继承属性的。原型属性是在实例对象创建之时就设设好的,通过new创建的对象,使用构造函数中的prototype属性作为它的原型属性。
function x() { this.name = 'ye'} x.prototype.number = 2; y = new x(); console.log(y); ->x {name: "ye", number: 2} (x.prototype).isPrototypeOf(y); ->true
以上是我在学习对象过程中的收获。
还剩下许多知识点还没有掌握,希望能够在以后的变成过程中,结合实际去学习。
以后会根据所学一点点更新的。