在js中,任何一个对象都有一个prototype属性,在js中记作:_proto_。学习
好比,咱们建立一个对象:prototype
<!-- lang: js --> var foo = { x:1, y:2 }
虽然看起来咱们只为foo对象建立了两个属性,实际上,它还有一个属性_proto_,如图: code
即便咱们不定义_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中没有,它便会顺着原型链向上查找。ip
此时,咱们给obj定义z值:原型链
<!--lang:js--> obj.z =10; //运行结果 obj;//返回foo {x: 1, y: 2, z: 10}
接着,删除z属性:get
<!--lang:js--> delete obj.z //运行结果 obj;//结果是:foo {x: 1, y: 2, z: 3}
可见,咱们的删除操做也只是obj上的,并不会对其原型产生影响。原型
属性定义:调用Object.defineProperty(object, propertyname, descriptor),三个项都是必须的。it
<!-- 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'} }}
若是咱们已经定义了这些属性,那么如何修改呢,其实也很简单,只要再次定义一下就能够了。
先记录这些,继续学习,继续补充笔记。