Object對象

前言

  • JavaScript原生提供Object對象
  • JavaScript的全部其餘對象都繼承自Object對象,即這些對象都是Object的實例
  • Object對象的原生方法分爲兩類:Object自己的方法、Object的實例方法

Object對象自己的方法

直接定義在Object對象的方法
Object.print = function (o) {
    console.log(o);
}

print方法就是直接定義在Object對象上數組

Object的實例方法

定義在Object原型對象Object.prototype上的方法,能夠被Object實例直接使用
Object.prototype.print = function () {
    console.log(this);
};

var obj = new Object();
obj.print() // Object

Object.prototype定義了一個print方法,而後生成一個Object的實例obj,obj直接繼承了Object.prototype的屬性和方法,因此能夠直接使用obj.print調用print方法,實質上就是obj對象的print方法就是調用Object.prototype.print方法函數

凡是定義在Object.prototype對象上面的屬性和方法,將被全部實例對象共享工具

Object()

Object自己是一個函數,能夠看成工具方法使用,將任意值轉爲對象

此方法經常使用於保證某個值必定是對象this

一、Object()返回一個空對象

var obj = Object();
// 等同於下面兩條語句
var obj = Object(undefined);
var obj = Object(null);
obj instanceof Object // true
  • Object()返回一個空對象
  • instanceof運算符驗證,一個對象是否爲指定的構造函數的實例,obj對象時Object的實例

二、若是參數是原始類型的值,Object()將其轉爲對應的包裝對象的實例

var obj = Object(1);
obj instanceof Object // true
obj instanceof Number // true

var obj = Object('foo');
obj instanceof Object // true
obj instanceof String // true

三、若是參數是一個對象,則老是返回該對象,不用轉換

var arr = [];
var obj = Object(arr); // 返回原數組
obj === arr // true

var fn = function() {};
var obj = Object(fn); // 返回原函數
obj === fn // true

// 一個判斷變量是否爲對象的函數
function isObject(value) {
    return value === Object(value);
}
isObject([]) // true
isObject(true) // false

Object構造函數

經過 var obj = new Object()的寫法生成新對象,與字面量的寫法 var obj = {}是等價的

構造函數的用法與工具方法相同點

  • 使用時,能夠接受一個參數,若是該參數是一個對象,則直接返回這個對象,若是是一個原始類型的值,則返回該值對應的包裝對象prototype

    var o1 = {a: 1};
       var o2 = new Object(o1);
       o1 === o1 // true 
    
       var obj = new Object(123);
       obj instanceof Number // true

構造函數的用法與工具方法不一樣點

  • Object(value)表示將value轉成一個對象
  • new Object(value)表示生成一個對象,它的值是value

部署在Object對象自身的方法

Object.keys()

用來遍歷對象的屬性

Object.keys方法的參數是一個對象,返回一個數組,該數組的成員都是該對象自身的全部屬性名,而不是繼承的屬性名code

只返回可枚舉的屬性對象

var obj = {
    p1: 123,
    p2: 456,
};
Object.keys(obj) // ["p1", "p2"]

Object.getOwnPropertyNames()

用來遍歷對象的屬性

接受一個對象做爲參數,返回一個數組,包含了該對象自身的全部屬性名繼承

還返回不可枚舉的屬性名ip

var obj = {
    p1: 123,
    p2: 456,
};
Object.keys(obj) // ["p1", "p2"]

var a = ["hello", "hi"];
Object.keys(a) // ["0", "1"]
Object.getOwnPropertyNames(a) // ["0", "1", "length"]

能夠用上面兩個方法提供計算對象屬性個數的方法原型鏈

var obj = {
    p1: 1,
    p2: 2
};
Object.keys(obj).length // 2
Object.getOwnPropertyNames(obj).length // 2

其餘方法

  1. 對象屬性模型的相關方法

    Object.getOwnPropertyDescriptor():獲取某個屬性的描述對象
    Object.defineProperty():經過描述對象,定義某個屬性
    Object.defineProperties():經過描述對象,定義多個屬性
  2. 控制對象狀態的方法

    Object.preventExtensions():防止對象擴展
    Object.isExtensible():判斷對象是否可擴展
    Object.seal():禁止對象配置
    Object.isSealed():判斷一個對象是否可配置
    Object.freeze():凍結一個對象
    Object.isFrozen():判斷一個對象是否被凍結
  3. 原型鏈相關方法

    Object.create():該方法能夠指定原型對象和屬性,返回一個新的對象
    Object.getPrototypeOf():獲取對象的Prototype對象

Object的實例方法

定義在Object.prototype對象,全部Object的實例對象都繼承了這些方法

主要的Object實例對象的方法

  • Object.prototype.valueOf():返回當前對象對應的值
  • Object.prototype.toString():返回當前對象對應的字符串形式
  • Object.prototype.toLocaleString():返回當前對象對應的本地字符串形式
  • Object.prototype.hasOwnProperty():判斷某個屬性是否爲當前對象自身的屬性,仍是繼承自原型對象的屬性
  • Object.prototype.isPrototypeOf():判斷當前對象是否爲另外一個對象的原型
  • Object.prototype.propertyIsEnumerable():判斷某個屬性是否可枚舉
相關文章
相關標籤/搜索