国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

JavaScript 原型鏈/Function/Object/屬性搜索原則/instanceof

2019-11-06 06:07:23
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1. 原型鏈(1)對(duì)象的原型鏈繪制原型鏈的結(jié)構(gòu)(三角形)[] -> Array.PRototype -> Object.prototype -> nullp -> Person.prototype -> Object.prototype -> null{} -> Object.prototype -> null原型式繼承:① 原型式繼承就是原型中提供的成員,我們的實(shí)例對(duì)象可以直接使用,好像是自己的一樣② 所謂的操作原型式繼承就是在對(duì)原型鏈做增加、刪除、修改的操作
//如果有 animalfunction Person() {}Person.prototype = animal;var p = new Person();//原型鏈(相當(dāng)于在原來(lái)的鏈中增加了一節(jié)):p -> Person.prototype(其實(shí)是animal) -> Animal.prototype -> Object.prototype(2)函數(shù)的原型鏈繪制原型鏈的結(jié)構(gòu)(3)完整原型鏈結(jié)合對(duì)象的原型鏈和函數(shù)的原型鏈,將其繪制到一起

2. Function

Function 是函數(shù)的構(gòu)造函數(shù)(函數(shù)的constructor屬性就等于Function)借助這個(gè)理論可以繪制函數(shù)的對(duì)象原型鏈(三角形)

3. 利用 Function 構(gòu)建函數(shù)

定義一個(gè)函數(shù)需要有:① 參數(shù)② 函數(shù)體③ 返回值 這三個(gè)東西本質(zhì)上是代碼,js允許將這些代碼以字符串的形式放到 Function 中,來(lái)構(gòu)建函數(shù)。語(yǔ)法:
var func = new Function( 參數(shù)1, 參數(shù)2, ..., 函數(shù)體 )例:設(shè)計(jì)一個(gè)函數(shù),求兩個(gè)數(shù)字的和
var sum = new Function( 'a', 'b', 'return a+b;' );函數(shù)體太多內(nèi)容時(shí),一般來(lái)說(shuō)使用字符串拼接 + 折行顯示。為了解決麻煩,引入ES6中的可換行字符串,數(shù)字鍵左邊的左撇號(hào)。第三種方法,在頁(yè)面添加一個(gè)標(biāo)簽
<script type="text/template" id="code">    函數(shù)體</script>document.createElementFragment應(yīng)用:所見(jiàn)即所得的編輯器

4. 繪制函數(shù)的原型鏈結(jié)構(gòu)

函數(shù)的構(gòu)造函數(shù)是 FunctionFunction 是什么數(shù)據(jù)類(lèi)型?函數(shù)結(jié)論:Function 是 Function 的構(gòu)造函數(shù)① Function.prototype 是原型對(duì)象,F(xiàn)unction 就繼承自該原型對(duì)象② Function 是 Function 的實(shí)例Function instanceof Function 為 true推論:Function instanceof Object 為 trueObject instanceof Function 為 trueFunction 也是函數(shù),因此 Function 是 Function 的實(shí)例這是原型鏈中唯一的特例(兩個(gè)對(duì)象構(gòu)成三角形關(guān)系)因此,F(xiàn)unction 的 .prototype 與 .__proto__ 指向同一個(gè)對(duì)象一般的函數(shù)不是這樣function Person() {}1) Person.prototype 是用于描述實(shí)例對(duì)象的, 表示 new Person() 所繼承的對(duì)象. 2) Person.__proto__ 是用于描述 Person 這個(gè)函數(shù)作為對(duì)象來(lái)說(shuō)是 Function 的實(shí)例. 是 Function.prototype. 因此一般的函數(shù), 這兩個(gè)屬性不是同一個(gè)對(duì)象.Function -> Function.prototype -> Object.prototype -> null例如:希望讓js中的所有函數(shù)都有 inherit 方法,來(lái)實(shí)現(xiàn)派生Function.prototype.inherit = function() {}Object.prototype.inherit = function() {}

5. __proto__

作用:讓實(shí)例對(duì)象可以訪問(wèn)到該原型對(duì)象早期是無(wú)法直接訪問(wèn)的,如果早期需要訪問(wèn),用 obj.constructor.prototype這樣不方便調(diào)試,很麻煩,因此在火狐中率先引入 __proto__ 屬性,用于讓對(duì)象直接訪問(wèn)其原型。由于當(dāng)時(shí)是非標(biāo)準(zhǔn)屬性,因此使用__作為前后綴。但是由于非常好用,今天的瀏覽器基本都實(shí)現(xiàn)了該屬性,但依舊沒(méi)有標(biāo)準(zhǔn)化(IE8不支持)。因此在開(kāi)發(fā)時(shí),不建議用,也不可以使用該屬性。調(diào)試原型鏈結(jié)構(gòu):obj.__protp__.__proto__.__proto__.__proto__因此在實(shí)際開(kāi)發(fā)中,使用 __proto__ 只是用于調(diào)試查看,即只用其讀的特性。以前的結(jié)論:① 只有函數(shù)有 prototype 屬性② 只有實(shí)例對(duì)象有 __proto__ 屬性今天的結(jié)論:函數(shù)也是對(duì)象,函數(shù)也有 __proto__ 屬性① 函數(shù)有 prototype 屬性,該屬性指向原型,該原型被函數(shù)的實(shí)例對(duì)象所繼承② 函數(shù)有 __proto__ 屬性,該屬性指向原型,該函數(shù)繼承自該原型③ 函數(shù)的 __proto__ 就是 Function.prototype,F(xiàn)unction.__proto__ 就是 Function.prototype

6. Object 本身就是一個(gè)構(gòu)造函數(shù)

function Person() { }// Object 與 Person 是等同地位的就像人是由基因決定的,無(wú)論是父親還是兒子都有基因基因就好比構(gòu)造函數(shù),決定對(duì)象有什么成員,也就是對(duì)象長(zhǎng)什么樣子結(jié)論:① 對(duì)象應(yīng)該都有原型② 實(shí)例對(duì)象繼承自 構(gòu)造函數(shù).prototype③ 原型對(duì)象也有繼承的關(guān)系④ 只有原型中有 constructor,constructor 決定了原型的名字如果 constructor 是 AAA, 那么 這個(gè)原型就是 AAA.prototype到此我們得到對(duì)象的原型鏈結(jié)構(gòu)1) [ ]    [ ] -> Array.prototype -> Object.prototype -> null2) p: Person    p -> Person.prototype -> Object.prototype -> null3) { }    { } -> Object.prototype -> null結(jié)合原型式繼承. 什么是原型式繼承? 怎么操作原型式繼承?1) 原型式繼承就是 原型中提供的成員, 我們的實(shí)例對(duì)象可以直接使用, 好像是自己的一樣.2) 所謂的操作原型式繼承就是在 對(duì)原型鏈做增加, 刪除, 修改的操作.
//如果有 animalfunction Person () {}Person.prototype = animal;var p = new Person();...//原型鏈://p -> Person.prototype( 其實(shí)是 animal ) -> Animal.prototype -> Object.prototype -> null

7. 字面量的原型鏈

所謂的字面量就是在代碼中的寫(xiě)出來(lái)以后有數(shù)據(jù)、有大小、有類(lèi)型等具體的數(shù)據(jù)。常見(jiàn)的字面量有:數(shù)字    1,2,123, ...布爾值    true,false字符串    'xxxxxx'對(duì)象    { },注意有時(shí)需要使用( { } )數(shù)組    [ ]函數(shù)    function() { }正則表達(dá)式    /.+/字面量中,凡是引用類(lèi)型的都有對(duì)應(yīng)的構(gòu)造函數(shù),因此原型鏈的繪制就簡(jiǎn)單了。8. 屬性搜索原則錯(cuò)誤的結(jié)論:如果一個(gè)對(duì)象中沒(méi)有對(duì)應(yīng)的方法,但是其原型中提供了該方法,該對(duì)象可以直接使用原型中的方法,就好像是自己的方法一樣。所謂的屬性搜索原則是說(shuō),對(duì)象在訪問(wèn)某一個(gè)成員的時(shí)候,采用的訪問(wèn)規(guī)則① 首先在當(dāng)前對(duì)象中查找是否有對(duì)應(yīng)的成員(在自己的代碼結(jié)構(gòu)中找)② 如果有,則使用該成員,并停止查找,如果沒(méi)有,則到其原型對(duì)象中查找對(duì)應(yīng)的成員③ 如果其原型中有該成員,則使用,并停止查找,否則繼續(xù)往原型的原型中查找④ 如此往復(fù)⑤ 直到 Object.prototype 中,如果還沒(méi)有對(duì)應(yīng)的成員,則返回 undefined訪問(wèn)依照就近原則

9. 原型成員的讀寫(xiě)

在讀取數(shù)據(jù)的時(shí)候,如果當(dāng)前對(duì)象沒(méi)有該數(shù)據(jù),原型中提供了該數(shù)據(jù),那么可以直接訪問(wèn)該數(shù)據(jù)。但是,如果是修改屬性,不會(huì)對(duì)原型中的數(shù)據(jù)造成任何影響,只會(huì)在當(dāng)前對(duì)象中新創(chuàng)建一個(gè)該成員,再次讀取該成員時(shí),就不再走原型上的數(shù)據(jù)了。

10. instanceof 運(yùn)算符

語(yǔ)法:object(要檢測(cè)的對(duì)象) instanceof constructor(某個(gè)構(gòu)造函數(shù))  -> boolean含義:檢測(cè) constructor.prototype 是否存在于 object 的原型鏈上,即一個(gè)對(duì)象在其原型鏈中是否存在一個(gè)構(gòu)造函數(shù)的 prototype 屬性案例1:
function Person() {}var p = new Person();p instanceof Person   // true//p 的原型鏈://p -> Person.prototype -> Object.prototype -> null案例2:
function Person() {}var p1 = new Person();Person.prototype = {};var p2 = new Person();console.log( p1 instanceof Person );//falseconsole.log( p2 instanceof Person );//true//分析原型鏈://p1 -> Person.prototype(原始的類(lèi)型) -> Object.prototype -> null//p2 -> Person.prototype( { } ) -> Object.prototype -> null//現(xiàn)在 Person.prototype 是 { }//p1 instanceof Person 表示檢測(cè) { } 是否在 p1 的原型鏈中 -> false//p2 instanceof Person 表示檢測(cè) { } 是否在 p2 的原型鏈中 -> true案例3:
console.log(Function instanceof Object);//true//Object.prototype 是否在 Function 的原型鏈中console.log(Function instanceof Function);//true//Function.prototype 是否在 Function 的原型鏈中console.log(Object instanceof Object);//true//Object.prototype 是否在 Object 的原型鏈中console.log(Object instanceof Function);//true//Function.prototype 是否在 Object 的原型鏈中//Object -> Function.prototype -> Object.prototype -> null    Object、Function、Array 等等都是構(gòu)造函數(shù),都是函數(shù) => 而所有函數(shù)都是構(gòu)造函數(shù) Function 的實(shí)例 => 從原型鏈機(jī)制來(lái)說(shuō),所有函數(shù)都能通過(guò)原型鏈找到創(chuàng)建他們的構(gòu)造函數(shù) Function 的構(gòu)造原型 Function.prototype 對(duì)象=> Object instanceof Function 的結(jié)果為 true    又因?yàn)?nbsp;Function.prototype 是一個(gè)對(duì)象=> Function.prototype 的構(gòu)造函數(shù)是 Object=> 從原型鏈機(jī)制來(lái)說(shuō),所有對(duì)象都能通過(guò)原型鏈找到創(chuàng)建它們的構(gòu)造函數(shù) Object 的構(gòu)造原型 Object.prototype 對(duì)象=> Function instanceof Object 的結(jié)果為 true    Function 是構(gòu)造函數(shù)=> Function 是函數(shù)對(duì)象=> 函數(shù)對(duì)象都是由 Function 構(gòu)造函數(shù)創(chuàng)建而來(lái)的,從原型鏈機(jī)制來(lái)說(shuō),函數(shù)對(duì)象的原型鏈中存在 Function.prototype => Function.prototype 在構(gòu)造函數(shù) Function 的原型鏈中被查到=> Function instanceof Function 的結(jié)果為 true結(jié)論:在 js 中,一切皆對(duì)象,它們?nèi)坷^承自 Object,或者說(shuō)所有對(duì)象的原型鏈的根節(jié)點(diǎn)都是 Object.prototypejs原型鏈-jk.png

11. Object.prototype 的常用成員

(1)hasOwnProperty

語(yǔ)法:對(duì)象.hasOwnProperty( '屬性名稱(chēng)' ) -> boolean含義:判斷某個(gè)屬性是否是當(dāng)前對(duì)象提供,而不是原型提供的作用:一般在寫(xiě)混入的時(shí)候會(huì)使用for(var k in obj){    //只混入當(dāng)前對(duì)象的屬性    if(obj.hasOwnProperty(k)){        dist[k] = obj[k];    }}

(2)isPrototypeOf

語(yǔ)法:對(duì)象A.isPrototypeOf( 對(duì)象B ) -> boolean含義:判斷 對(duì)象A 是不是 對(duì)象B 的原型(實(shí)質(zhì)上是判斷對(duì)象A是否在對(duì)象B的原型鏈中)

(3)prototypeIsEnumerable

語(yǔ)法:對(duì)象A.prototypeIsEnumerable( '屬性名稱(chēng)' ) -> boolean含義:判斷當(dāng)前對(duì)象是否提供對(duì)應(yīng)的屬性,同時(shí)該屬性可枚舉在 js 中一般添加的成員都是可枚舉的(所謂的可枚舉就是利用 for in 可以遍歷出來(lái))在 ES5 之前,所有的自定義屬性都是可枚舉的,是無(wú)法控制的。因此該方法很少使用。在 ES5 之后,引入了 Object.definedPrototype 等方法,允許用戶(hù)定義不可枚舉的屬性。

(4)valueOf

將對(duì)象轉(zhuǎn)換成基本類(lèi)型(實(shí)現(xiàn)的不好,平時(shí)不會(huì)用,都是自己實(shí)現(xiàn)該方法去轉(zhuǎn)換)內(nèi)部的實(shí)現(xiàn)就是 return this,把自己返回了,并沒(méi)有實(shí)現(xiàn)功能,沒(méi)什么用處

(5)toString

將對(duì)象轉(zhuǎn)換成字符串(實(shí)現(xiàn)的不好,平時(shí)不會(huì)用,都是自己實(shí)現(xiàn)該方法去轉(zhuǎn)換)
console.log(s.toString());//[object Object](假設(shè)s是個(gè)對(duì)象)console.log([].toString());//默認(rèn)將數(shù)組元素用逗號(hào)連接,因此會(huì)打印空//數(shù)組自己有 toString 方法

(6)toLocaleString

將對(duì)象轉(zhuǎn)換成本地字符串(實(shí)現(xiàn)的不好,平時(shí)不會(huì)用,都是自己實(shí)現(xiàn)該方法去轉(zhuǎn)換)例:計(jì)算機(jī)毫秒數(shù)從1970年開(kāi)始算


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 伊川县| 察雅县| 甘洛县| 永川市| 会昌县| 岳阳市| 新平| 仁寿县| 花垣县| 台前县| 兴海县| 关岭| 海盐县| 哈巴河县| 东阿县| 若尔盖县| 景东| 荣昌县| 白山市| 雷山县| 大竹县| 北海市| 淮安市| 琼结县| 麻栗坡县| 香港 | 兰溪市| 珠海市| 辽中县| 理塘县| 霍山县| 张家川| 怀安县| 山丹县| 台中市| 邵东县| 苏尼特右旗| 南靖县| 江达县| 景宁| 青海省|