1.建立对象函数
建立:对象直接量、new、Object,create()。this
原型:每个对象(除了null)都和另外一个对象(原型)相关联,每一个对象都从原型继承属性(prototype)。prototype
//例如 new Array()、[] //建立的对象都继承自Array.prototype; //Array.prototype又继承自Object.prototype,由此构成的一系列………………………………就是原型链。
建立对象create()的用法:code
//create(): var o = Object.create({a:1,b:2}); //若是create(null)的话,他建立的对象不继承任何。 var o1 = Object.create(Object.prototype); //这样则和new Object()相同。 //经过原型建立新对象(模拟原型继承) function inherit(p){ if(p == null){ throw TypeError(); } if(Object.create){ return Object.create(p); } var t = typeOf p; if(t != 'object' && t != 'function){ throw TypeError(); } function f(){}; f.prototype = p; return new f(); }
2.继承对象
what is
it?:假设一个对象obj,并查找他的属性o1,若是obj中存在则找到,若是不存在会在obj的原型中查找,若是还木有就在原型对象的原型上边查找,知道找到了或者原型为null了。继承
var obj = {}; obj.o1 = 1; var p = inherit(obj)//前边写过的一个函数; p.o2 = 2; p.o1 = 2; console.log(p.toString());//找到Object.prototype中的toString(); console.log(p.o1);//找到obj.prototype,结果是3,以前提到的不会修改原型链。
属性访问错误:ip
var obj = {}; console.log(obj.v.length);//抛出异常,由于undefined没有length属性。 //能够用下边的方法↓ var len = obj&&obj.v&&obj.v.length; //利用&&的“短路性”,并在有操做值为true的时候返回其返回值。
3.删除属性原型链
delete不能够删除继承属性,要删除就要在原型对象上删除,而且会影响全部继承它的对象。get
var obj = {a:1}; delete obj.a;//delete obj['a'];删除a属性; delete obj.b;//true delete obj.toString();//true delete 1;//true
4.检测属性原型
in运算符:检测对象以及对象原型链上是否有某属性;
hasOwnProperty:检测对象自己是否有某属性;
propertyIsEnumerable:检测对象自己是否有某可枚举属性;
!==运算符:经过判断属性是否!==undefined;
5.枚举属性
for/in枚举:会枚举出自行添加的属性,须进行判断;
//经过判断来枚举 for(var i in obj){ if(!obj.hasOwnProperty(i)) continue; } //经过extend来枚举↓一个不是很完善的extend function extend(obj,obj1){ for(var i in obj1){ obj[i] = obj1[i] } return obj; }
Object.keys()枚举:ES5;
Object.getOwnPropertyNames()枚举:ES5。
5.getter和setter
获取和设置属性的方法
var obj = { val:100, get getval(){ return this.val; }, set setval(x){ this.val = x; } }
6.属性的特性
数据属性:值、可写性、可枚举性、可配置性。
存取器属性:读取、写入、可枚举性、可配置性。
经过Object.getOwnPropertyDescriptor()来获取自有特性。
经过definedProperty()/definedProperties()设置属性的特性。
Stronger的extend();
Object.defineProperty(Object.prototype,"extend",{ writable:true, emuerable:false, configration:true, value:function(obj){ var names = Object.getOwnPropertyNames(obj); for(var i = 0 ; i <names.length ; i++){ if(names[i] in this) continue; var temp = Object.getOwnPropertyDescriptor(obj,names[i]); Object.defineProperty(this,names[i],temp); } } })
getter&setter老得API,非标准方法
_lookupGetter_ _lookupSetter_ _defineGetter_ _defineSetter_
7.原型属性
用Object.getPrototypeOf()查询原型。
未完~~~