摘要:如前面提到,實(shí)例對(duì)象通過(guò)訪問(wèn)原型。那么,原型鏈?zhǔn)裁磿r(shí)候到頭呢默認(rèn)的原型鏈結(jié)構(gòu)又是怎樣的呢凡是使用構(gòu)造函數(shù),并且沒(méi)有利用賦值方法修改原型的對(duì)象,則保留默認(rèn)的原型鏈,該原型鏈通過(guò)一直向上訪問(wèn)必須最終到頭,返回值。原型也是一個(gè)對(duì)象,繼承自。
原型鏈 什么是原型鏈
根據(jù)之前關(guān)于原型的知識(shí)(https://segmentfault.com/a/11...),漸漸引出了原型鏈的概念。凡是對(duì)象都有原型,而在JavaScript中,萬(wàn)物皆對(duì)象,所以,原型也是對(duì)象,也具有原型,也就是原型的原型,如此下去,會(huì)構(gòu)成一個(gè)對(duì)象序列,該結(jié)構(gòu)即為原型鏈。如前面提到,實(shí)例對(duì)象通過(guò) proto 訪問(wèn)原型。
那么,原型鏈?zhǔn)裁磿r(shí)候到頭呢?默認(rèn)的原型鏈結(jié)構(gòu)又是怎樣的呢?
凡是使用構(gòu)造函數(shù),并且沒(méi)有利用賦值方法修改原型的對(duì)象,則保留默認(rèn)的原型鏈,該原型鏈通過(guò) proto 一直向上訪問(wèn)必須最終到頭,返回值 null。注意,這里說(shuō)的是原型的值為null,需要與之前的屬性查找原則所說(shuō)的沒(méi)有該屬性返回的是undefined區(qū)分開來(lái)。
以一個(gè)簡(jiǎn)單的構(gòu)造函數(shù)為例,演示默認(rèn)的原型鏈結(jié)構(gòu):
function Person(){} var p = new Person(); 當(dāng)前實(shí)例對(duì)象 -> Person.prototype -> Object.prototype -> nll 可以在Google瀏覽器調(diào)試工具中查看什么是原型式繼承
通過(guò)修改(增加、刪除等)原型鏈結(jié)構(gòu),使得實(shí)例對(duì)象具有原型鏈上的所有方法
函數(shù)的原型鏈上面講的是對(duì)象的原型鏈,那函數(shù)的原型鏈呢?
1、函數(shù)的構(gòu)造函數(shù)
在js中,使用Function可以實(shí)例化函數(shù)對(duì)象,也就是說(shuō)在js中,函數(shù)與普通對(duì)象一樣,也是一個(gè)對(duì)象類型,所以函數(shù)可以
使用對(duì)象的動(dòng)態(tài)特性
用構(gòu)造函數(shù)創(chuàng)建函數(shù)
創(chuàng)建其他對(duì)象
唯一可以限定變量作用域的結(jié)果
2、Function的實(shí)例代碼
var foo = new Function("參數(shù)一", "參數(shù)二", "..."); Function的參數(shù)全是字符串,它是將參數(shù)連接起來(lái)的函數(shù) 沒(méi)有參數(shù),表示空函數(shù); 只有一個(gè)參數(shù),表示函數(shù)體; 有N個(gè)參數(shù),最后一個(gè)表示函數(shù)體,前面所有的都表示函數(shù)體的參數(shù);
綜上,new Function 在功能上與普通函數(shù)并無(wú)二意。從下面的代碼,也可以看出。
function foo(a, b){ var sum = a + b; return sum; } var foo = new Function("a", "b", "var sum = a + b; return sum;");
3、函數(shù)的原型鏈
任何函數(shù)都是Function的實(shí)例,所以函數(shù)可以通過(guò)__proto__訪問(wèn)到其原型(Function.prototype)。原型也是一個(gè)對(duì)象,繼承自O(shè)bject.prototype。當(dāng)前的原型鏈結(jié)構(gòu)為:
fn -> Function.prototype -> Object.prototype -> null
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100105.html
摘要:是完全的面向?qū)ο笳Z(yǔ)言,它們通過(guò)類的形式組織函數(shù)和變量,使之不能脫離對(duì)象存在。而在基于原型的面向?qū)ο蠓绞街?,?duì)象則是依靠構(gòu)造器利用原型構(gòu)造出來(lái)的。 JavaScript 函數(shù)式腳本語(yǔ)言特性以及其看似隨意的編寫風(fēng)格,導(dǎo)致長(zhǎng)期以來(lái)人們對(duì)這一門語(yǔ)言的誤解,即認(rèn)為 JavaScript 不是一門面向?qū)ο蟮恼Z(yǔ)言,或者只是部分具備一些面向?qū)ο蟮奶卣?。本文將回歸面向?qū)ο蟊疽猓瑥膶?duì)語(yǔ)言感悟的角度闡述為什...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:基于原型的面向?qū)ο笤诨谠偷恼Z(yǔ)言中如并不存在這種區(qū)別它只有對(duì)象不論是構(gòu)造函數(shù),實(shí)例,原型本身都是對(duì)象。允許動(dòng)態(tài)地向單個(gè)的對(duì)象或者整個(gè)對(duì)象集中添加或移除屬性。為了解決以上兩個(gè)問(wèn)題,提供了構(gòu)造函數(shù)創(chuàng)建對(duì)象的方式。 showImg(https://segmentfault.com/img/remote/1460000013229218); 一. 重新認(rèn)識(shí)面向?qū)ο?1. JavaScript...
摘要:基于原型的面向?qū)ο笤诨谠偷恼Z(yǔ)言中如并不存在這種區(qū)別它只有對(duì)象不論是構(gòu)造函數(shù),實(shí)例,原型本身都是對(duì)象。允許動(dòng)態(tài)地向單個(gè)的對(duì)象或者整個(gè)對(duì)象集中添加或移除屬性。為了解決以上兩個(gè)問(wèn)題,提供了構(gòu)造函數(shù)創(chuàng)建對(duì)象的方式。 showImg(https://segmentfault.com/img/remote/1460000013229218); 一. 重新認(rèn)識(shí)面向?qū)ο?1. JavaScript...
閱讀 2553·2023-04-26 00:57
閱讀 924·2021-11-25 09:43
閱讀 2228·2021-11-11 16:55
閱讀 2241·2019-08-30 15:53
閱讀 3604·2019-08-30 15:52
閱讀 1471·2019-08-30 14:10
閱讀 3388·2019-08-30 13:22
閱讀 1221·2019-08-29 11:18