摘要:開局先上一張圖分清楚函數(shù)與對(duì)象得到結(jié)論對(duì)象都有這個(gè)屬性但是只有函數(shù)對(duì)象才有這個(gè)屬性。所有的原型對(duì)象都有屬性,該屬性對(duì)應(yīng)創(chuàng)建所有指向該原型的實(shí)例的構(gòu)造函數(shù)。原型鏈的頂端是。的原型鏈的上一個(gè)節(jié)點(diǎn)是本身這個(gè)很奇怪哎。
開局先上一張圖、分清楚函數(shù)與對(duì)象:
得到結(jié)論:對(duì)象都有_proto_這個(gè)屬性,但是只有函數(shù)對(duì)象才有prototype這個(gè)屬性。
得出上面結(jié)論后我們?cè)偕弦粡垐D、我們對(duì)話題研究都是基于這張圖:
根據(jù)上圖,自己些代碼論證一下得出一下結(jié)論: const Foo =function(){}; const Foo_prototype = Foo.prototype; const f1 = new Foo(); Foo.prototype == Foo.prototype //true Foo_prototype.constructor == Foo //true //1得出結(jié)論,Foo是一個(gè)函數(shù)對(duì)象,Foo的原型Foo_prototype的構(gòu)造函數(shù)就是Foo本身 f1.__proto__ == Foo.prototype // true //2得出結(jié)論,foo的實(shí)例指向f1的原型鏈上一個(gè)節(jié)點(diǎn)也就是Foo的原型 Foo_prototype.__proto__ == Object;//true //3得出結(jié)論,Foo原型指向Foo的上一個(gè)原型節(jié)點(diǎn) const Object_prototype = Object.prototype; Object_prototype.__proto__ == null//true //4得出結(jié)論,Object的原型鏈上一個(gè)節(jié)點(diǎn)是null,這也就是萬(wàn)物皆對(duì)象,null中生對(duì)象 const Function_prototype = Function.prototype; Object.__proto__ == Function_prototype//true //5得出結(jié)論,原生對(duì)象指向Function的原型, Function.__proto__ == Function_prototype;//true //6得出結(jié)論,Function的原型鏈的上一個(gè)節(jié)點(diǎn)是Function本身 Foo.__proto__ == Function_prototype//true //7得出結(jié)論,Foo的原型鏈上一個(gè)節(jié)點(diǎn)指向Function
**經(jīng)過上述代碼驗(yàn)證得出如下結(jié)論:
1.所有對(duì)象都有_proto_這個(gè)屬性。
2.所有的原型對(duì)象都有constructor屬性,該屬性對(duì)應(yīng)創(chuàng)建所有指向該原型的實(shí)例的構(gòu)造函數(shù)。
3.原型鏈的頂端是null。
**
**4.對(duì)象本身的prototype和_proto_毫無關(guān)系,_proto_指向原型鏈上一個(gè)節(jié)點(diǎn)的原型。
5.Function的原型鏈的上一個(gè)節(jié)點(diǎn)是Function本身(這個(gè)很奇怪哎)。**
OK,拋出一個(gè)問題:
//通常情況下,為了只繼承父函數(shù)的原型而不繼承其他靜態(tài)方法往往這樣定義 b = function(){}; c = function(){}; b.prototype.say = 1; c.prototype.say = 2; function extend(father,son){ var def = function(){}; def.prototype = father.prototype; son.prototype = new def(); } extend(b,c)
問題:
1.繼承的時(shí)候可以直接使用son.prototype = father.prototype 嗎?
2.為什么要新建一個(gè)def函數(shù),然后son繼承def的原型來繼承呢?
3.通過1方法和2方法生成的son是一樣的嗎?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/93200.html
摘要:在上面的各種原型的變換中,其實(shí)難點(diǎn)就在于構(gòu)造函數(shù)也是對(duì)象原型對(duì)象等所有對(duì)象都由構(gòu)造這四個(gè)點(diǎn)。 這篇文章主要是學(xué)習(xí)一下JavaScript中的難點(diǎn)------原型和原型鏈 自定義一個(gè)對(duì)象 我們學(xué)習(xí)一門編程語(yǔ)言,必然要使用它完成一些特定的功能,而面向?qū)ο蟮恼Z(yǔ)言因?yàn)榉先祟惖恼J(rèn)知規(guī)律,在這方面做得很好,今天我以JS為例,探索一下JS不同于其他面向?qū)ο蟮恼Z(yǔ)言的地方-------原型和原型鏈 首...
摘要:在上面的各種原型的變換中,其實(shí)難點(diǎn)就在于構(gòu)造函數(shù)也是對(duì)象原型對(duì)象等所有對(duì)象都由構(gòu)造這四個(gè)點(diǎn)。 這篇文章主要是學(xué)習(xí)一下JavaScript中的難點(diǎn)------原型和原型鏈 自定義一個(gè)對(duì)象 我們學(xué)習(xí)一門編程語(yǔ)言,必然要使用它完成一些特定的功能,而面向?qū)ο蟮恼Z(yǔ)言因?yàn)榉先祟惖恼J(rèn)知規(guī)律,在這方面做得很好,今天我以JS為例,探索一下JS不同于其他面向?qū)ο蟮恼Z(yǔ)言的地方-------原型和原型鏈 首...
摘要:接下來我們來聊一下的原型鏈繼承和類。組合繼承為了復(fù)用方法,我們使用組合繼承的方式,即利用構(gòu)造函數(shù)繼承屬性,利用原型鏈繼承方法,融合它們的優(yōu)點(diǎn),避免缺陷,成為中最常用的繼承。 JavaScript是一門面向?qū)ο蟮脑O(shè)計(jì)語(yǔ)言,在JS里除了null和undefined,其余一切皆為對(duì)象。其中Array/Function/Date/RegExp是Object對(duì)象的特殊實(shí)例實(shí)現(xiàn),Boolean/N...
摘要:類才支持實(shí)例屬性代碼解讀上面暫時(shí)只是概念性的寫法,事實(shí)上,的類只是一個(gè)原型鏈的語(yǔ)法糖而已,主要是從寫法上更接近于面相對(duì)象的類而已,另外一個(gè)作用就是區(qū)分的構(gòu)造函數(shù)和函數(shù)之間的區(qū)分。 ES5的原型鏈和ES6的類實(shí)現(xiàn)詳解 JavaScript最初設(shè)計(jì)時(shí)受到了面相對(duì)象編程的影響,從而引入了new關(guān)鍵字,來實(shí)例化對(duì)象。而在ES5中new后面跟著的是構(gòu)造函數(shù)(也是函數(shù)),而到了ES6則改成了cla...
閱讀 1014·2023-04-25 15:42
閱讀 3608·2021-11-02 14:38
閱讀 2900·2021-09-30 09:48
閱讀 1443·2021-09-23 11:22
閱讀 3404·2021-09-06 15:02
閱讀 3199·2021-09-04 16:41
閱讀 617·2021-09-02 15:41
閱讀 2026·2021-08-26 14:13