javascript權威指南筆記(第6章 對象)

 一、對象概述

1.一、對象常見的用法:javascript

  create 、set 、Query 、delete 、test、enumeratejava

1.二、對象的屬性特性:數組

  可寫、可枚舉、可配置dom

1.三、每一個對象的對象特性:ide

  原型、對象的類、對象的可擴展性函數

1.四、對象和屬性分類:工具

  內置對象、宿主對象、自定義對象、自由屬性、繼承屬性 oop

 


二、建立對象ui

2.一、對象直接量this

2.二、經過new建立對象

2.三、原型

2.四、Object.create()

  第一個參數:這個對象的原型

  第二個參數:可選、對對象的屬性進行進一步描述

var o1 = Object.create({x:1, y:2}); // o1 inherits properties x and y.
var o2 = Object.create(null); // o2 inherits no props or methods.
var o3 = Object.create(Object.prototype); // o3 is like {} or new Object().

  通用的inherit()函數,兼容版本(可是並不能徹底替代create如不能接受第二參數)

function inherit(p) {
    if (p == null) throw TypeError(); // p must be a non-null object
    if (Object.create) // If Object.create() is defined...
    return Object.create(p); // then just use it.
    var t = typeof p; // Otherwise do some more type checking
    if (t !== "object" && t !== "function") throw TypeError();
    function f() {}; // Define a dummy constructor function.
    f.prototype = p; // Set its prototype property to p.
    return new f(); // Use f() to create an "heir" of p.
}

三、屬性的查詢和設置

3.一、做爲關聯數組的對象

  javascript對象都是關聯數組,點訪問和括號訪問的差別

3.二、繼承

3.三、屬性訪問錯誤  

var len = book && book.subtitle && book.subtitle.length;

  這段代碼的做用:避免屬性訪問錯誤的方法

  3.4下面的情形給對象o設置屬性p會失敗:

    一、o中的屬性p是隻讀的

    二、o的屬性p時繼承的,且是隻讀的:不能經過自有屬性覆蓋只讀屬性的繼承屬性

    3、o中不存在自有屬性且o的可擴展性爲false

 


四、刪除屬性:

  4.1 delete只能刪除自有屬性,不能刪除繼承屬性;

a = {p:{x:1}};
b = a.p;
delete  a.p;

   note: b.p的值仍然是1;因此在銷燬某個對象的時候,要遍歷屬性中的屬性,一次刪除  

    delete Object.prototype;//false 不能刪除不可配置屬性
    var x = 1; 
    delete this.x;  //不能刪除
    function f() {}
    delete this.f; //不能刪除全局函數
    this.u = 1;
    delete u; //true

 


五、檢測屬性

  in

  !==undefined

  hasOenpreperty()

  propertyIsEnumerable()


六、 枚舉屬性:

     6.1用於枚舉屬性的對象工具函數

/**********合併p和o的可枚舉屬性,若是同名,覆蓋o的屬性,並返回o*/
function extend(o, p) {
    for (prop in p) {
        o[prop] = p[prop];
    }
    return o;
}

function merge(o, p) {
    for (prop in p) {
        if (o.hasOwnProperty[prop]) continue;
        o[prop] = p[prop];
    }
    return o;
}

function restrict(o, p) {
    for (prop in o) {
        if (!(prop in p)) delete o[prop];
        return o;
    }
}

function subtract(o, p) {
    for (prop in p) {
        delete o[prop];
    }
    return o;
}


function union(o, p) {
    return extend(extend({}, o), p);
}


function intersection(o, p) {
    return restrict(extend({}, o), p);
}

function keys(o) {
    if (typeof o !== "object") throw TypeError();
    var result = [];
    for (var prop in o) {
        if (o.hasOwnProperty(prop)) result.push(prop);
    }
    return result;
}

 

  6.2  Es5 中的Object.keys():返回一個數組,這個數組由對象中的能夠枚舉的自由屬性的名稱組成

     ES5中的Object.getOwnProperty Names():返回全部自由屬性的名稱,而不單單是可枚舉屬性


七、getter和setter: 存儲器屬性

  ES5中的屬性值能夠用一個或兩個方法函數取代

  數據屬性與存儲器屬性的不一樣:

  例子:

var o = {
// An ordinary data property
    data_prop: value,
// An accessor property defined as a pair of functions
    get accessor_prop() {
        /* function body here */
    },
    set accessor_prop(value) {
        /* function body here */
    }
};
var p = {
    x: 1.0,
    y: 1.0,
    get r() {
        return Math.sqrt(this.x * this.x + this.y * this.y);
    },
    set r(newvalue) {
        var oldvalue = Math.sqrt(this.x * this.x + this.y * this.y);
        var ratio = newvalue / oldvalue;
        this.x *= ratio;
        this.y *= ratio;
    },
    get theta() {
        return Math.atan2(this.y, this.x);
    } }

 

  這個對象產生一個嚴格的序列號:

var serialnum = {
    $n: 0,
    get next() {
        return this.$n++;
    },
    set next(n) {
        if (n >= this.$n) this.$n = n;
        else throw "serial number can only be set to a larger value";
    }
};

 

  random的一個神奇的屬性:不固定,而是一個隨機數

var random = {
    get octet() { return Math.floor(Math.random()*256); },
    get uint16() { return Math.floor(Math.random()*65536); },
    get int16() { return Math.floor(Math.random()*65536)-32768; }
};

 


八、屬性的特性
    數據屬性:值屬性、可寫性、可枚舉性、可配置性

     存儲器屬性:get/set/configurable/enumerable,它並無值屬性

  設置屬性特性的方法:

  1. Object.getOwnPropertyDescriptor():

  2. Object.defineProperties

  設置屬性特性的方法注意的規則: 詳細見書中

 

  重寫extend工具函數:

Object.defineProperty(Object.prototype,
    "extend", {
        writable: true,
        enumerable: false,
        configurable: true,
        value: function (o) {
            var names = Object.getOwnPropertyNames(o);   // Loop through them
            for (var i = 0; i < names.length; i++) {
                if (names[i] in this) continue;
                var desc = Object.getOwnPropertyDescriptor(o, names[i]); 
                Object.defineProperty(this, names[i], desc);
            }
        }
    });

   getter和setter的老式API:

    __lookupGetter__()      __lookupSetter__()    __defineGetter__()   defineSetter__()


 

九、對象的三個屬性:

原型屬性(判斷原型):

  Object.getprototypeof()    

   o.constructor.prototype

    isPrototypeOf()

    instanceof

類屬性:注意經過對象直接量和Object.create建立的對象和自定義構造函數建立的對象的類屬性是Object

function classof(o) {
if (o === null) return "Null";
if (o === undefined) return "Undefined";
return Object.prototype.toString.call(o).slice(8,-1);
}

 

如:

classof(null) // => "Null"
classof(1) // => "Number"
classof("") // => "String"
classof(false) // => "Boolean"
classof({}) // => "Object"
classof([]) // => "Array"
classof(/./) // => "Regexp"
classof(new Date()) // => "Date"
classof(window) // => "Window" (a client-side host object)
function f() {}; // Define a custom constructor
classof(new f()); // => "Object"

可擴展性:

Object.isExtensible()

Object.preventExtensions().

Object.seal();   將全部的對象設置不能擴展並且對象的全部自有屬性設置不可刪除和配置,不過他已有的可寫屬性仍然能夠設置

Object.isSealed();

Object.freeze();更嚴格,自有的全部數據屬性設置爲只讀,可是存儲器屬性不受影響

Object.isFrozen()


 

十、系列化對象,對象

十一、對象方法:

  hasOenproperty();

propertyIsEnumerable();

isPrototypeOf();

object.create()

object.getprototypeof()

toString()

toLocaleString();

toJson();

valueOf();

相關文章
相關標籤/搜索