摘要:它不區(qū)分該屬性是對(duì)象自身的屬性,還是繼承的屬性。那么我們要遍歷對(duì)象所有屬性,包括繼承以及不可遍歷的屬性,用加原型遍歷實(shí)現(xiàn)類似的用遞歸
Object靜態(tài)方法
Object自身方法,必須由Object調(diào)用,實(shí)例對(duì)象并不能調(diào)用Object.getPrototypeOf()
作用是獲取目標(biāo)對(duì)象的原型
function F() {}; var obj = new F(); console.log(Object.getPrototypeOf(obj) === F.prototype);
其等同于求obj.__proto__ = obj.[[prototype]]的值
需要注意的是普通函數(shù)也是Function的實(shí)例對(duì)象,所以function f() {}; Object.getPrototypeOf(f); // Function.prototype
作用是為目標(biāo)對(duì)象設(shè)置原型
var sub = {a : 1}; var super = {b : 1}; Object.setPrototypeOf(sub, super); //sub.__proto__ = super
Object.setPrototypeOf要實(shí)現(xiàn)的效果就是sub.__proto__ = super,也就是Object.getPrototypeOf(sub)等于 super,返回值是sub
模擬new的實(shí)現(xiàn)
function F() { this.a = 123; }; var o = new F(); //等價(jià)于 //var o1 = Object.setPrototypeOf({}, F.prototype); 創(chuàng)建一個(gè)空對(duì)象并且以F.prototype為原型的實(shí)例對(duì)象 //F.call(o1); 并將this的屬性以及方法給o1Object.create()
作用與setPrototypeOf類似,創(chuàng)建一個(gè)空對(duì)象并以參數(shù)對(duì)象為原型的實(shí)例對(duì)象,第一個(gè)參數(shù)必須是對(duì)象或者null
var o = new Object(); //var o = Object.create({}); //var o = Object.create(Object.prototype);
看起來(lái)Object.prototype等同于空對(duì)象,我的理解是這邊因?yàn)橘x值都是
{constructor: ?, __defineGetter__: ?, __defineSetter__: ?, hasOwnProperty: ?, __lookupGetter__: ?,?…}
所以這三者等價(jià)
create的創(chuàng)建模擬如下:
function creat(obj) { function F() {}; F.prototype = obj; //prototype的作用就是將值放入o.__proto__中(o = new F()) return new F(); }
因?yàn)閧}與Object.prototype賦值給F.prototype值一樣,所以結(jié)果一樣
當(dāng)參數(shù)為null時(shí),返回的實(shí)例對(duì)象,是比空值還空的對(duì)象,不繼承Object的原型
還可以填入第二個(gè)參數(shù),參數(shù)為屬性描述對(duì)象,并將其屬性添加到實(shí)例對(duì)象中
var supe = {b : 2}; var obj = Object.create(supe, { a : { value : 123, writable : true, enumerable : true, configurable : true, } }); //obj //{a: 123} //a: 123 // __proto__: // b: 2 //這邊是prototype賦入的b // __proto__: ObjectObject.assign()
Object.assign(target,sources...sources)
作用是將源對(duì)象的自身可遍歷屬性淺拷貝到目標(biāo)對(duì)象中,并返回最終的目標(biāo)對(duì)象
注意點(diǎn)是:
可遍歷屬性
自身(OwnProperty)屬性
相同且可修改屬性會(huì)覆蓋,不可修改屬性覆蓋會(huì)報(bào)錯(cuò)
string或者Symbol類型是可以被直接分配的 (Symbol還未接觸,暫且放放)
var suber = Object.create({a : 1}, { a : { value : 0, writable : true, //false時(shí),target為suber時(shí)會(huì)報(bào)錯(cuò) enumerable : false, configurable : true, }, b : { value : 1, writable : true, enumerable : true, configurable : true, }, c : { value : "c", writable : true, enumerable : true, configurable : true, }, }); var suber1 = Object.create({t : 1}, { b : { value:2, writable : false, enumerable : true, configurable : true, } }); var suber2 = Object.create({a : 1}, { b : { value : 3, writable : true, enumerable : true, configurable : true, } }); console.log(Object.assign(suber, suber1,suber2)); //{b: 3, c: "c", a: 0} //console.log(Object.assign({}, suber, suber1,suber2)); //{b: 3, c: "c"}
從代碼中可看出:
判斷是否只讀是以target對(duì)象的屬性描述對(duì)象為基準(zhǔn),當(dāng)target為{}時(shí),b的所有enumerable為false,也能賦值上去
屬性描述對(duì)象并不會(huì)拷貝
只有原始類型為string才可以被直接分配的,(Symbol還未接觸,暫且放放)
console.log(Object.assign({},"asd")); //{0: "a", 1: "s", 2: "d"}Object的實(shí)例方法 Object.prototype.isPrototypeOf()
isPrototypeOf作用判斷目標(biāo)對(duì)象是否為參數(shù)對(duì)象的原型o1.isPrototypeOf(o2)==> o1 === o2.__proto__ ? true : false
由這個(gè)全等符號(hào)也可以看出原型鏈就是對(duì)象之間的鏈接就是對(duì)象引用(地址)的賦值
in運(yùn)算符返回一個(gè)布爾值,表示一個(gè)對(duì)象是否具有某個(gè)屬性。它不區(qū)分該屬性是對(duì)象自身的屬性,還是繼承的屬性。
不管是否可以遍歷
for-in:遍歷對(duì)象所有可遍歷屬性。它不區(qū)分該屬性是對(duì)象自身的屬性,還是繼承的屬性。
那么我們要遍歷對(duì)象所有屬性,包括繼承以及不可遍歷的屬性,
用getOwnPropertyNames加原型遍歷實(shí)現(xiàn)
function getAllPropertyNames(target) { //var arr = []; var props = {}; while(target) { Object.getOwnPropertyNames(target).forEach(function(p) { props[p] = true; }); target = Object.getPrototypeOf(target); } return Object.getOwnPropertyNames(props); } var o = {a : 1}; console.log(getAllPropertyNames(o));
類似的用遞歸
function getAllPropertyNames(n) { var sup = Object.getPrototypeOf(n); if (sup == null) { return Object.getOwnPropertyNames(n); } return Object.getOwnPropertyNames(n).concat(getAllPropertyNames(sup)); } Array.prototype.unique = function() { var obj = {}; this.forEach(function (elem) { obj[elem] = true; }); return Object.getOwnPropertyNames(obj); } console.log(getAllPropertyNames(Date).unique());
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98198.html
摘要:命令作用作用是執(zhí)行構(gòu)造函數(shù),返回實(shí)例對(duì)象上面例子是自定義一個(gè)構(gòu)造函數(shù),其最大的特點(diǎn)就是首字母大寫,用執(zhí)行構(gòu)造函數(shù)其中,在的執(zhí)行下,代表了實(shí)例化后的對(duì)象,這個(gè)也就有屬性注意點(diǎn)如果不用執(zhí)行構(gòu)造函數(shù),那么指向的是全局有兩種方式可以避免內(nèi)部定義嚴(yán)格 new命令 new作用 作用是執(zhí)行構(gòu)造函數(shù),返回實(shí)例對(duì)象 function F() { this.name = object } var ...
摘要:原型要掌握這三者之間的關(guān)系,通過(guò)代碼例子記錄一下自身屬性的這里就是通過(guò)代碼看一下做了什么默認(rèn)情況下,將的所有屬性包括繼承的賦值給有什么東西呢自己的原型鏈,添加一個(gè)屬性,用來(lái)指明對(duì)象的誰(shuí)構(gòu)造的自身全部屬性,這邊構(gòu)建一個(gè)空對(duì)象原型,所以沒(méi)有自有 原型 要掌握這三者之間的關(guān)系prototype,constructor,__proto__通過(guò)代碼例子記錄一下 function F() { ...
摘要:原始類型的值只有四種字符串?dāng)?shù)值必須以十進(jìn)制表示布爾值和不能使用和。字符串必須使用雙引號(hào)表示,不能使用單引號(hào)。數(shù)組或?qū)ο笞詈笠粋€(gè)成員的后面,不能加逗號(hào)。 JSON對(duì)象 補(bǔ)充記錄一下,有些方法很需要熟練記憶的 JSON對(duì)象的規(guī)定 JSON對(duì)象對(duì)值有嚴(yán)格的規(guī)定 復(fù)合類型的值只能是數(shù)組或?qū)ο螅荒苁呛瘮?shù)、正則表達(dá)式對(duì)象、日期對(duì)象。原始類型的值只有四種:字符串、數(shù)值(必須以十進(jìn)制表示)、布爾值和...
摘要:繼承是面向?qū)ο缶幊陶Z(yǔ)言中的一個(gè)重要的概念,繼承可以使得子類具有父類的屬性和方法或者重新定義追加屬性和方法等。但是在中沒(méi)有類的概念,是基于原型的語(yǔ)言,所以這就意味著對(duì)象可以直接從其他對(duì)象繼承。 繼承是面向?qū)ο缶幊陶Z(yǔ)言中的一個(gè)重要的概念,繼承可以使得子類具有父類的屬性和方法或者重新定義、追加屬性和方法等。但是在Javascript中沒(méi)有類的概念,是基于原型的語(yǔ)言,所以這就意味著對(duì)象可以直接...
摘要:搬家篇三開(kāi)胃菜因?yàn)榇笥诘扔诘谋容^,不是相等的比較,所以值得注意的操作符一元操作符通過(guò)進(jìn)行轉(zhuǎn)換其中包括號(hào)運(yùn)算符,號(hào)運(yùn)算符,都是經(jīng)轉(zhuǎn)換邏輯運(yùn)算符等價(jià)于將操作數(shù)進(jìn)行布爾值類型轉(zhuǎn)換位操作當(dāng)一邊操作數(shù)為時(shí),可等價(jià)于操作數(shù)為由以下變化可以證得加號(hào)運(yùn)算 搬家篇三 開(kāi)胃菜 [] == ![] //true ==> == false 123 ^ [] ...
閱讀 1734·2021-11-22 12:09
閱讀 1461·2019-08-30 13:22
閱讀 2094·2019-08-29 17:00
閱讀 2644·2019-08-29 16:28
閱讀 2956·2019-08-26 13:51
閱讀 1183·2019-08-26 13:25
閱讀 3245·2019-08-26 12:14
閱讀 3015·2019-08-26 12:14