Object物件的相關方法

2022-09-13 16:12:17 字數 3319 閱讀 8064

object.getprototypeof方法返回引數物件的原型。這是獲取原型物件的標準方法。

var f = function () {};

var f = new f();

object.getprototypeof(f) === f.prototype // true

下面是幾種特殊物件的原型。

// 空物件的原型是 object.prototype

object.getprototypeof({}) === object.prototype // true

// object.getprototypeof(object.prototype) === null // true

function f() {}

object.getprototypeof(f) === function.prototype // true

object.setprototypeof方法為引數物件設定原型,返回改引數物件。它接受兩個引數。第乙個是現有物件,第二個是原型物件。

var a = {};

var b = ;

object.setprototypeof(a, b);

object.getprototypeof(a) === b // true

new命令可以使用object.setprototypeof方法模擬。

var f = function () ;

var f = new f();

// 等同於

var f = object.setprototypeof({}, f.prototype);

f.call(f);

上面**中,new命令新建例項物件,其實可以分為兩步。第一步,將乙個空物件的原型設為建構函式的prototype屬性;第二步,將建構函式內部的this繫結這個空物件,然後執行建構函式,使得定義在this上面的方法和屬性都轉移到這個空物件上。

生成例項物件的常用方法是,使用new命令讓建構函式返回乙個例項。但是很多時候,只能拿到乙個例項物件,它可能根本不是由建構函式生成的,那麼能不能從乙個例項物件,生成另乙個例項物件呢?

j**ascript提供了object.create方法,用來滿足這種需求。該方法接受乙個物件作為引數,然後以它為原型,返回乙個例項物件。

var a = 

};var b = object.create(a);

object.getprototypeof(b) === a // true

b.print() // hello

如果想要生成乙個不繼承任何屬性(比如沒有tostring和valueof方法)的物件,可以將object.create的引數設為null。

object.create方法,必須提供物件原型,即引數不能為空,或者不是物件,否則會報錯。object.create方法生成的物件動態繼承了原型。在原型上新增或修改任何方法,會立刻反應到新物件上。

除了原型物件,object.create還可以接受第二個引數。改引數是乙個屬性描述物件,他所描述的物件屬性,會新增到例項物件,作為該物件自身的屬性。

var obj = object.create({}, ,

p2:

});// 等同於

var obj = object.create({});

obj.p1 = 123;

obj.p2 = "abc";

例項物件的isprototypeof方法用來判斷物件是否為引數物件的原型。

例項物件的proto屬性(前後各兩個下劃線),返回該物件的原型。該屬性可讀寫。根據語言標準,proto屬性只有瀏覽器才需要部署,其他環境可以沒有這個屬性。它前後的兩根下劃線表明它本質是乙個內部屬性,不應該對使用者暴露。因此,應該盡量少使用這個屬性,而是用object.getprototypeof()和object.setprototypeof(),進行原型物件的讀寫操作。

如前所述,proto屬性指向當前物件的原型物件,即建構函式的prototype屬性。

獲取例項物件obj的原型物件,有三種方法。

object.getownpropertynames方法返回乙個陣列,成員是引數物件本身的所有屬性的鍵名,不包含繼承的屬性鍵名。

object.getownpropertynames(date)

// ["parse", "arguments", "utc", "caller", "name", "prototype", "now", "length"]

object.getownpropertynames方法返回所有的鍵名,不管是否可遍歷。只需要獲取可遍歷的屬性,使用object.keys方法。

物件例項的hasownproperty方法返回乙個布林值,用於判斷某個屬性定義在物件自身,還是原型鏈上。另外,hasownproperty方法是j**ascript之中唯一乙個處理物件屬性時,不會遍歷原型鏈的方法

in運算子返回乙個布林值,表示乙個物件是否具有某個屬性。它不區分該屬性是物件自身的屬性,還是繼承的屬性。

"length" in date // true

"tostring" in date // true

為了在for...in迴圈中獲取物件自身的屬性,可以採用hasownproperty方法判斷。

for (var name in object) 

}

獲取物件的所有屬性(不管是自身還是繼承,不管是否可列舉),可以使用下面的函式。

function inheritedpropertynames(obj) ;

while(obj) );

obj = object.getprototypeof(obj);

}return object.getownpropertynames(props);

}

如果拷貝乙個物件,需要做到下面兩件事情。

function copyobject(orig) 

function copyownpropertiesfrom(target, source) );

return target;

}

另一種簡單的寫法,是利用es2017才引入標準的object.getownpropertydescriptors方法。

function copyobject(orig)

物件(Object)相關

詳情參考 js原生提供object建構函式。js中所有的物件都是object的例項。定義乙個物件最簡單的就是var obj es6屬性和方法允許簡寫。物件的super屬性只能用在簡寫的方法中,其他的地方都會報錯。let a 5 let obj 屬性可以使用訪問器表示。訪問器的使用場合一般是 屬性的值...

object靜態方法 和原型物件

1.hasownproperty property 所有繼承了 object 的物件都會繼承到 hasownproperty 方法。這個方法可以用來檢測乙個物件是否含有特定的自身屬性 和 in 運算子不同,該方法會忽略掉那些從原型鏈上繼承到的屬性。2.isprototypeof protoobj 方...

object物件的反射

有個朋友 不要問我這個朋友是誰,反正是乙個朋友 手動狗頭 在用泛型的時候,傳入乙個object型別,發現並沒有反射出內部屬性,說一下原因。1.首先需要知道 object是乙個類,但是他內部是沒有屬性的 想要反射出他的屬性,說明是將其他類裝箱成了object,例如 object a new stude...