Javascript權威指南--每日一讀(對象啊~找對象啊~)

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

未完~~~

相關文章
相關標籤/搜索