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()查詢原型。
未完~~~