原生javascript對象的方法

來源:互聯網
上載者:User

標籤:多個   個數   null   ctp   rabl   eal   asc   順序   evel   

create

Object.create() 方法建立一個擁有指定原型和若干個指定屬性的對象。

Object.create(proto [, propertiesObject ])
  • proto 為新建立對象的原型對象,設定為null可建立沒有原型的Null 物件。
  • propertiesObject 包涵若干個屬性的描述符和defineProperties的第二個參數一樣。

    Object.create(Object.prototype, { a: { value: 1, writable: true, configurable: true } });

建立一個繼承自Object.prototype的對象,有一個屬性a,其可寫,可配置,不可枚舉,值為1。

defineProperty

Object.defineProperty() 方法直接在一個對象上定義一個新屬性,或者修改一個已經存在的屬性, 並返回這個對象。

Object.defineProperty(obj, prop, descriptor)

descriptor 可包含4個屬性,如下:

  • configurable 若且唯若這個屬性描述符值為 true 時,該屬性可能會改變,也可能會被從相應的對象刪除。預設為 false。
  • enumerable true 若且唯若該屬性出現在相應的對象枚舉屬性中。預設為 false。
  • value 屬性的值
  • writable 定義屬性值是否可寫。
  • get 一個給屬性提供 getter 的方法,如果沒有 getter 則為 undefined。方法將返回用作屬性的值。預設為 undefined。
  • set 同get一起使用,功能互補。

其中value和writable一組,get和set一組,不可同時出現。

// 顯式Object.defineProperty(obj, "key", {enumerable: false,configurable: false,writable: false,value: "static"});

上面給obj對象定義了一個屬性key,其不可枚舉,不可配置,唯讀,值為static。

defineProperties

Object.defineProperties() 方法在一個對象上添加或修改一個或者多個自有屬性,並返回該對象。

Object.defineProperties(obj, props)
getPrototypeOf

Object.getPrototypeOf() 方法返回指定對象的原型(也就是該對象內部屬性[[Prototype]]的值)。

Object.getPrototypeOf(object)

可以用來擷取對象的原型。

Object.getPrototypeOf({}) === Object.prototype// > true

在es5之前,要達到上面同樣的方法,只能使用 constructor。

getOwnPropertyDescriptor

Object.getOwnPropertyDescriptor() 返回指定對象上一個自有屬性對應的屬性描述符。(自有屬性指的是直接賦予該對象的屬性,不需要從原型鏈上進行尋找的屬性)

Object.getOwnPropertyDescriptor(obj, prop)

可用來擷取或查看對象屬性的特性。

var obj = {a: 1};Object.getOwnPropertyDescriptor(obj, ‘a‘);// > Object {value: 1, writable: true, enumerable: true, configurable: true}
({}).constructor.prototype === Object.prototype// > true

keys

Object.keys() 方法會返回一個由給定對象的所有可枚舉自身屬性的屬性名稱組成的數組,數組中屬性名稱的排列順序和使用for-in迴圈遍曆該對象時返回的順序一致(兩者的主要區別是 for-in 還會遍曆出一個對象從其原型鏈上繼承到的可枚舉屬性)。

Object.keys(obj)

典型的用法如下:

var obj = {a: 1, b: 2};console.log(Object.keys(obj));// > ["a", "b"]

keys可以用來代替原來的for in迴圈,藉助es5新增的數組方法,可提升代碼可讀性。

Object.keys(obj).forEach(function (val) {console.log(val)});
 
getOwnPropertyNames

Object.getOwnPropertyNames()方法返回一個由指定對象的所有自身屬性的屬性名稱(包括不可枚舉屬性)組成的數組。

Object.getOwnPropertyNames(obj)

其和Object.keys的區別就是能夠擷取自身的全部屬性,包括不可枚舉屬性。

preventExtensions

Object.preventExtensions() 方法讓一個對象變的不可擴充,也就是永遠不能再添加新的屬性。

Object.preventExtensions(obj)

需要注意的是不可擴充的對象的屬性通常仍然可以被刪除。

嘗試給一個不可擴充項物件添加新屬性的操作將會失敗,在非strict 模式下是靜默的,在strict 模式下會拋出TypeError異常。

Object.preventExtensions 只能阻止一個對象不能再添加新的自身屬性,仍然可以為該對象的原型添加屬性。

在 ECMAScript 5 中可擴充的對象可以變得不可擴充,但反過來不行。

isExtensible

Object.isExtensible() 方法判斷一個對象是否是可擴充的(是否可以在它上面添加新的屬性)。

seal

Object.seal() 方法可以讓一個對象密封,並返回被密封后的對象。密封對象是指那些不能添加新的屬性,不能刪除已有屬性,以及不能修改已有屬性的可枚舉性、可配置性、可寫性,但可能可以修改已有屬性的值的對象。

Object.seal(obj)

密封一個對象會讓這個對象變的變為不可擴充的,且所有已有屬性會變的不可配置。屬性不可配置的效果就是屬性變的不可刪除,以及一個資料屬性不能被重新定義成為訪問器屬性,或者反之。但屬性的值仍然可以修改。

嘗試刪除一個密封對象的屬性或者將某個密封對象的屬性從資料屬性轉換成訪問器屬性,結果會靜默失敗或拋出TypeError異常(strict 模式)。

isSealed

Object.isSealed() 方法判斷一個對象是否是密封的(sealed)。

freeze

Object.freeze() 方法可以凍結一個對象。凍結對象是指那些不能添加新的屬性,不能修改已有屬性的值,不能刪除已有屬性,以及不能修改已有屬性的可枚舉性、可配置性、可寫性的對象。也就是說,這個對象永遠是不可變的。該方法返回被凍結的對象。

Object.freeze(obj)

凍結對象是不可擴充的,密封的,同時期值屬性的writable會被設定為false,set也將失效,總之會變為不可更改。任何嘗試修改該對象的操作都會失敗,可能是靜默失敗,也可能會拋出異常(strict 模式)。

isFrozen

Object.isFrozen() 方法判斷一個對象是否被凍結(frozen)。

 

assign

Object.assign() 方法可以把任意多個的來源物件自身的可枚舉屬性拷貝給目標對象,然後返回目標對象。

Object.assign(target, ...sources)
getOwnPropertySymbols

Object.getOwnPropertySymbols() 方法會返回一個數組,該數組包含了指定對象自身的(非繼承的)所有 symbol 屬性鍵。

 

is

Object.is() 方法用來判斷兩個值是否是同一個值。

Object.is與嚴格比較子(===)的行為基本一致,不同之處只有兩個:一是+0不等於-0,二是NaN等於自身。

setPrototypeOf

將一個指定的對象的原型設定為另一個對象或者null(既對象的[[Prototype]]內部屬性)。

Object.setPrototypeOf(obj, prototype)
Object.prototype

Object.prototype上的方法,都是執行個體方法,必須在對象執行個體上調用。

  • hasOwnProperty
  • isPrototypeOf⑤
  • propertyIsEnumerable⑤
  • __proto__ ⑥
hasOwnProperty

hasOwnProperty() 方法用來判斷某個對象是否含有指定的自身屬性。

obj.hasOwnProperty(prop)

在沒有Object.keys之前,藉助hasOwnProperty,可以讓for in 達到類似的效果,代碼如下:

for(var key in obj) {if (obj.hasOwnProperty(key)) {//過濾掉原型上的方法}}
isPrototypeOf

isPrototypeOf() 方法測試一個對象是否存在於另一個對象的原型鏈上。

prototype.isPrototypeOf(object)
propertyIsEnumerable

propertyIsEnumerable() 方法返回一個布爾值,表明指定的屬性名稱是否是當前對象可枚舉的自身屬性。

obj.propertyIsEnumerable(prop)

從原型鏈上繼承的屬性,所以該方法會返回false。

如果對象沒有指定的屬性,該方法返回 false。

__proto__

一個對象的__proto__ 屬性和自己的內部屬性[[Prototype]]指向一個相同的值 (通常稱這個值為原型),原型的值可以是一個對象值也可以是null(比如說Object.prototype.__proto__的值就是null).該屬性可能會引發一些錯誤,因為使用者可能會不知道該屬性的特殊性,而給它賦值,從而改變了這個對象的原型。 如果需要訪問一個對象的原型,應該使用方法Object.getPrototypeOf。 __proto__ 屬性已經被添加在了ES6草案 §B.3.1中。

 

原生javascript對象的方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.