摘要:一相當(dāng)于拿實(shí)例對(duì)象的名字來給原型命名。不專業(yè)點(diǎn)說的實(shí)例函數(shù)為匿名函數(shù),而中,構(gòu)造函數(shù)即原型鏈展示的原型為匿名函數(shù)。關(guān)系圖不通過創(chuàng)造,不通過各種情況擾亂的情況下分析為原型屬性,展示構(gòu)造函數(shù),比如上面舉例的某同學(xué)的媽媽構(gòu)造函數(shù)。
這篇文章只是我個(gè)人的見解,因?yàn)橐彩墙衲陝偖厴I(yè),所以理解不一定非常的準(zhǔn)確,如果理解有誤希望大家告訴我。
一、class 相當(dāng)于 拿實(shí)例對(duì)象的名字 來給 原型 命名。
為什么這么說呢。
先說說 es6中的用法 :
class testClass{ constructor(name,age){ this.name = name; this.age = age; } printFn() { console.log(this.age); } } new testClass("hello",18).printFn()//18
這個(gè)類用 es5怎么寫呢:
function testProto(name,age) { this.name = name; this.age = age; } testProto.prototype.printFn = function(){ console.log(this.age); } new testProto("hello",18).printFn();
其實(shí)寫法上是差不太多的。
不專業(yè)點(diǎn)說:class的實(shí)例函數(shù)(constructor)為匿名函數(shù),而es5中,構(gòu)造函數(shù)(即原型鏈prototype展示的原型)為匿名函數(shù)。
class例子中,class是有名字的 —— testClass,每個(gè)類的constructor唯一,就像每本書的目錄 是唯一的,那么翻書的時(shí)候,正常說法就是打開 某本書的目錄,而不用特意去給目錄命名。
es5例子中,實(shí)例函數(shù)的名字是唯一的 —— testProto,他的構(gòu)造對(duì)象,就是,他的原型鏈對(duì)象,testProto.prototype。這就像老師找學(xué)生家長聊天一樣,一般老師都會(huì)說,讓某同學(xué)(testProto)的媽媽(prototype)過來一下,某同學(xué)的名字已知,那么他的媽媽也就確定了。當(dāng)實(shí)例化的時(shí)候(new testProto()),這個(gè)對(duì)象的名字就是以某同學(xué)的名字命名的。
prototype,constructor,__proto__關(guān)系圖(不通過create創(chuàng)造,不通過各種情況擾亂的情況下分析);
prototype為原型屬性,展示構(gòu)造函數(shù),比如上面舉例的某同學(xué)的媽媽(構(gòu)造函數(shù))。某同學(xué)就是他媽媽生(實(shí)例)的對(duì)象。這個(gè)用類的思想比較好理解,我們平時(shí)調(diào)用的方法,其實(shí)都是一個(gè)原型的實(shí)例化(constructor)。
實(shí)例化對(duì)象之后,屬性會(huì)存在于對(duì)象的__proto__中,當(dāng)調(diào)用一個(gè)屬性的時(shí)候,如果這個(gè)對(duì)象中沒有,就回去他的__proto__中查找。
舉個(gè)例子:
function test1() {console.log("test1")}; test1.prototype.test2 = function(){console.log(0)}; new test1().__proto__ .test2 == new test1().test2//true; new test1()實(shí)例化之后的結(jié)構(gòu)大概如下: test1 { __proto__:{ construtor:function(){console.log("test1")}, test2: function(){console.log(0)} } } construtor會(huì)被立即執(zhí)行 所以 控制臺(tái)會(huì)分別打印出 test1 ;test1 ;true;第一個(gè)test1 是執(zhí)行new test1().__proto__ .test2這句話時(shí)候打印出來的,第二個(gè)test1是執(zhí)行這句話new test1().test2的時(shí)候打印出來的。 new test1().constructor == test1//true; new test1().__proto__.constructor == test1 //true; 這句話可以證明“我們平時(shí)調(diào)用的方法,其實(shí)都是一個(gè)原型的實(shí)例化(constructor)。實(shí)例化對(duì)象之后,屬性會(huì)存在于對(duì)象的__proto__中,當(dāng)調(diào)用一個(gè)屬性的時(shí)候,如果這個(gè)對(duì)象中沒有,就回去他的__proto__中查找?!?
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/90796.html
摘要:面向?qū)ο髮?shí)現(xiàn)代碼動(dòng)物發(fā)聲汪汪喵喵調(diào)用代碼動(dòng)物發(fā)聲喵喵動(dòng)物發(fā)聲汪汪當(dāng)要增加一種動(dòng)物時(shí),只需增加一個(gè)繼承,不會(huì)影響其他已有的動(dòng)物邏輯。所以的繼承和的原型繼承,可謂殊途同歸。 傳統(tǒng)面向?qū)ο蟮睦^承和多態(tài) 我們知道C++/Java/C#等面向?qū)ο笳Z言,都原生地支持類的繼承。繼承的核心作用大抵是創(chuàng)建一個(gè)派生類,并使其復(fù)用基本類(即父類)的字段和/或方法。并且派生類可以重寫基本類的方法。這樣基本類和...
摘要:實(shí)例擁有構(gòu)造函數(shù)屬性,該屬性返回創(chuàng)建實(shí)例對(duì)象的構(gòu)造函數(shù)。在考慮對(duì)象而不是自定義類型和構(gòu)造函數(shù)的情況下,寄生式繼承也是一種有用的模式。在子類的構(gòu)造函數(shù)中,只有調(diào)用之后,才能使用關(guān)鍵字,否則報(bào)錯(cuò)。 不積跬步無以至千里。 關(guān)于【Step-By-Step】 Step-By-Step (點(diǎn)擊進(jìn)入項(xiàng)目) 是我于 2019-05-20 開始的一個(gè)項(xiàng)目,每個(gè)工作日發(fā)布一道面試題。每個(gè)周末我會(huì)仔細(xì)閱讀...
摘要:在這個(gè)情況下我們可能需要使用構(gòu)造函數(shù),其以指定的模式來創(chuàng)造對(duì)象。構(gòu)造函數(shù)也有自己的,值為,也通過其屬性關(guān)聯(lián)到。從邏輯上來說,這是以棧的形式實(shí)現(xiàn)的,它叫作執(zhí)行上下文棧。 原文:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ 對(duì)象 原型鏈 構(gòu)造函數(shù) 執(zhí)行上下文棧 執(zhí)行上下文 變量對(duì)象 活動(dòng)對(duì)象 作用域鏈 閉包 Thi...
閱讀 3414·2021-10-08 10:15
閱讀 5628·2021-09-23 11:56
閱讀 1479·2019-08-30 15:55
閱讀 457·2019-08-29 16:05
閱讀 2739·2019-08-29 12:34
閱讀 2052·2019-08-29 12:18
閱讀 925·2019-08-26 12:02
閱讀 1661·2019-08-26 12:00