物件的新增方法

2022-07-26 20:57:14 字數 4421 閱讀 4026

1.object.is()

用來比較兩個值是否嚴格相等,與嚴格比較運算子(===)的行為基本一致

object.is('

foo', '

foo')//

true

object.is

({}, {})

//false

不同之處只有兩個:一是+0不等於-0,二是nan等於自身。

+0 === -0

//true

nan === nan //

false

object.

is(+0, -0) //

false

object.is(nan, nan) //

true

2.object.assign()

用於物件的合併,將源物件的所有可列舉屬性,複製到目標物件(target)。

const target = ;

const source1 = ;

const source2 = ;

object.assign(target, source1, source2);

target

//

object.assign方法的第乙個引數是目標物件,後面的引數都是源物件。

注意,如果目標物件與源物件有同名屬性,或多個源物件有同名屬性,則後面的屬性會覆蓋前面的屬性。

const source1 = ;

const source2 = ;

object.assign(target, source1, source2);

target

//

object.assign拷貝的屬性是有限制的,只拷貝源物件的自身屬性(不拷貝繼承屬性),也不拷貝不可列舉的屬性。屬性名為symbol值的屬性,也會被object.assign拷貝。

object.assign方法實行的是淺拷貝,而不是深拷貝。也就是說,如果源物件某個屬性的值是物件,那麼目標物件拷貝得到的是這個物件的引用

(3)陣列的處理

object.assign可以用來處理陣列,但是會把陣列視為物件。

object.assign([1, 2, 3], [4, 5

])//

[4, 5, 3]

上面**中,object.assign把陣列視為屬性名為0、1、2的物件,因此原陣列的0號屬性4覆蓋了目標陣列的0號屬性1.

(4)取值函式的處理

object.assign只能進行值的複製,如果要複製的值是乙個取值函式,那麼將求值後再複製。

const source =

};const target ={};

object.assign(target, source)

//

上面**中,source物件的foo屬性是乙個取值函式,object.assign不會複製這個取值函式,只會拿到值以後,將這個值複製過去。

3.object.getownpropertydescriptors()

返回指定物件所有自身屬性(非繼承屬性)的描述物件。

也就是返回乙個物件,所有原物件的屬性名都是該物件的屬性名,對應的屬性值就是該屬性的描述物件。

const obj =

};object.getownpropertydescriptors(obj)//,

//bar:

// }

注意:object.assign方法總是拷貝乙個屬性的值,而不會拷貝它背後的賦值方法或取值方法。

該方法可以解決object.assign()無法正確拷貝get屬性和set屬性的問題。

要配合object.defineproperties()方法,就可以是實現正確拷貝了。

4._proto_屬性,

用來讀取或設定當前物件的prototype物件。(不推薦使用)

object.setprototypeof()(寫操作)、object.getprototypeof()(讀操作)、object.create()(生成操作)代替。

_proto_呼叫的是object.prototype._proto_

5.object.setprototypeof()

該方法的作用與_proto_相同,用來設定乙個物件的prototype物件,返回引數物件本身。

//

格式object.setprototypeof(object, prototype)

該方法等同於下面的函式:
function setprototypeof(obj, proto)

例子:
let proto ={};

let obj = ;

object.setprototypeof(obj, proto);

proto.y = 20

;proto.z = 40

;obj.x

//10

obj.y //

20obj.z //

40

將proto物件設為obj物件的原型,所以從obj物件可以讀取proto物件的屬性。

//如果第乙個引數不是物件,會自動轉為物件。但是由於返回的還是第乙個引數,所以這個操作不會產生任何效果。

所以如果第乙個引數是undefined或null,就會報錯。

5.object.getprototypeof()

該方法與object.setprototype方法配套,用於讀取乙個物件的原型物件。

object.getprototypeof(obj);

6.object.keys()

返回乙個陣列,成員是引數物件自身的(不含繼承)所有可遍歷屬性的鍵名

var obj = ;

object.keys(obj)

//["foo", "baz"]

7.object.values()

返回乙個陣列,成員是引數物件自身的(不含繼承的)所有可遍歷屬性的鍵值。

const obj = ;

object.values(obj)

//["bar", 42]

陣列的結果從小到大排序。

object.values(obj)會過濾屬性名為symbol值的屬性

object.create方法的第二個引數新增的物件屬性,如果不顯式宣告,預設是不可遍歷的,屬性描述物件的enumerable預設是false.
8.object.create()

來建立乙個新物件,使用現有的物件來提供新建立物件的_proto_.

語法:object.create(proto[, propertiesobject])

proto:新建立物件的原型物件

propertiesobject:是物件的屬性描述符,可選。

返回值:

乙個新物件,帶著指定的原型物件和屬性

8.object.enteries()

返回乙個陣列,成員是引數物件自身的(不含繼承)所有可遍歷屬性的鍵值對陣列。

const obj = ;

object.entries(obj)

//[ ["foo", "bar"], ["baz", 42] ]

除了返回值不一樣,該方法的行為與object.values基本一致。

如果原物件的屬性名是乙個symbol值,該屬性會被忽略。

object.entries的基本用途是遍歷物件的屬性。

9.object.fromentries()

object.fromentries()方法是object.entries()的逆操作,用於將乙個鍵值對陣列轉為物件。

object.fromentries([

['foo', '

bar'

], [

'baz

', 42]])

//

原型物件新增方法

在建構函式中為了避免建立多個物件,造成方法的重複建立,我們一般在原型物件上建立方法 如student.prototype.method function 但這種方法僅適用於物件的方法較少時,如果物件方法有很多,就需要不斷重複 類似student.prototype.method function.這...

給JS物件新增擴充套件方法

如何在js中像c 語法一樣,呼叫str.trim 呢?在js中string物件自己也有trim方法,可通過str.trim 實現 在jquery中jquery物件也封裝了trim方法,可通過 trim str 實現 可是對於trimstart,trimend的方法,js的string物件並沒有對應方...

Python中向物件動態新增方法

定義乙個類 class cat object pass 例項話乙個cat物件 c cat 向類中動態新增屬性 c.color white print c.color 結果為 white如果依照相同的方法新增方法,則 定義乙個類 class cat object pass 例項話乙個cat物件 c c...