标签:
在js中,任何一个对象都有一个prototype属性,在js中记做:_proto_。
比如,我们创建一个对象:
<!-- lang: js -->
var foo = {
x:1,
y:2
}
虽然看起来我们只为foo对象创建了两个属性,实际上,它还有一个属性_proto_,如图:
即使我们不定义_proto_,在js中也会预留一个属性。
如果我们定义一个空对象,foo
<!-- lang: js -->
foo = function(){}
foo.prototype.z = 3;
var obj = new foo();
obj.x = 1;
obj.y =2;
//运行结果
obj //结果是:foo {x: 1, y: 2, z: 3}
很显然。我们并没有给obj定义z值,但是却返回了z值,从这可以看出,obj中没有,它便会顺着原型链向上查找。
此时,我们给obj定义z值:
<!--lang:js-->
obj.z =10;
//运行结果
obj;//返回foo {x: 1, y: 2, z: 10}
接着,删除z属性:
<!--lang:js-->
delete obj.z
//运行结果
obj;//结果是:foo {x: 1, y: 2, z: 3}
可见,我们的删除操作也只是obj上的,并不会对其原型产生影响。
属性定义:调用Object.defineProperty(object, propertyname, descriptor),三个项都是必须的。
<!-- lang: js -->
Object.defineProperty(obj,‘title‘,{
value:‘helloworld‘,
});
其中,defineProperty()中的descriptor有四个属性,分别为:
此外,我们还可以查看属性,通过:Object.getOwnPropertyDescriptor(object, propertyname),两个项都是必须。如:
<!--lang:js-->
var foo = {
title:‘hello‘
};
console.log(Obejct.getOwnPropertyDescriptor(obj,‘title‘));
//运行结果是
//Object {value: "hello", writable: true, enumerable: true, configurable: true}
其次,我们也可以通过for-in来遍历输出每项属性。
<!--lang:js-->
var des = Object.getOwnPropertyDescriptor(obj,‘title‘);
for(var key in des){
console.log(key+‘:‘+des[key]);
}
//运行结果
//value:hello
//writable:true
//enumerable:true
//configurable:true
补充一点刚才定义属性用的是Object.defineProperty(),如果我们想一次性定义多个属性,只要修改一点就可以:
<!--lang:js-->
Object.defineProperties{person,{
name:{value:‘Gavin‘,writable:false,enumerable:false},
salaty:{value:5000,writable:true,enumerable:false},
sex:{value:‘man‘}
}}
如果我们已经定义了这些属性,那么如何修改呢,其实也很简单,只要再次定义一下就可以了。
先记录这些,继续学习,继续补充笔记。
标签:
原文地址:http://my.oschina.net/gavin0/blog/396509