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...