[{"data":1,"prerenderedAt":1404},["ShallowReactive",2],{"blog-javascript-prototype-e-heranca-com":3},{"id":4,"title":5,"author":6,"body":7,"date":1391,"description":1392,"extension":1393,"image":1394,"meta":1395,"navigation":120,"path":1396,"seo":1397,"stem":1398,"tags":1399,"__hash__":1403},"blog\u002Fblog\u002Fjavascript-prototype-e-heranca-com.md","Prototype e herança: como o JavaScript compartilha comportamento","Larissa Santos",{"type":8,"value":9,"toc":1375},"minimark",[10,14,19,27,233,249,264,272,275,282,285,487,509,513,516,612,623,627,634,860,863,869,887,892,895,1160,1179,1183,1193,1196,1215,1225,1229,1236,1240,1306,1315,1319,1328,1337,1340,1344,1371],[11,12,13],"p",{},"JavaScript não tem herança clássica como Java ou C#. Tem algo diferente: um sistema de protótipos onde objetos herdam de outros objetos. Entender essa diferença muda como você lê e escreve orientação a objetos em JS, e explica comportamentos que parecem estranhos à primeira vista.",[15,16,18],"h2",{"id":17},"o-que-é-prototype","O que é prototype",[11,20,21,22,26],{},"Todo objeto em JavaScript tem uma propriedade interna chamada ",[23,24,25],"code",{},"[[Prototype]]",". Ela aponta para outro objeto, e é por meio dessa referência que o JavaScript busca propriedades e métodos que não existem diretamente no objeto.",[28,29,34],"pre",{"className":30,"code":31,"language":32,"meta":33,"style":33},"language-js shiki shiki-themes material-theme-lighter github-dark github-dark","const animal = {\n  respirar() {\n    console.log(\"respirando...\");\n  }\n};\n\nconst cachorro = Object.create(animal);\ncachorro.latir = function() {\n  console.log(\"au!\");\n};\n\ncachorro.latir();    \u002F\u002F \"au!\" — próprio do cachorro\ncachorro.respirar(); \u002F\u002F \"respirando...\" — veio do prototype\n","js","",[23,35,36,57,69,103,109,115,122,145,165,188,193,198,216],{"__ignoreMap":33},[37,38,41,45,49,53],"span",{"class":39,"line":40},"line",1,[37,42,44],{"class":43},"sFsEu","const",[37,46,48],{"class":47},"sVPC0"," animal",[37,50,52],{"class":51},"sFfmW"," =",[37,54,56],{"class":55},"sG-J9"," {\n",[37,58,60,64,67],{"class":39,"line":59},2,[37,61,63],{"class":62},"s0u7J","  respirar",[37,65,66],{"class":55},"()",[37,68,56],{"class":55},[37,70,72,76,79,83,87,91,95,97,100],{"class":39,"line":71},3,[37,73,75],{"class":74},"sMo7A","    console",[37,77,78],{"class":55},".",[37,80,82],{"class":81},"sK_r7","log",[37,84,86],{"class":85},"sdv8B","(",[37,88,90],{"class":89},"sF_wb","\"",[37,92,94],{"class":93},"s0vBq","respirando...",[37,96,90],{"class":89},[37,98,99],{"class":85},")",[37,101,102],{"class":55},";\n",[37,104,106],{"class":39,"line":105},4,[37,107,108],{"class":55},"  }\n",[37,110,112],{"class":39,"line":111},5,[37,113,114],{"class":55},"};\n",[37,116,118],{"class":39,"line":117},6,[37,119,121],{"emptyLinePlaceholder":120},true,"\n",[37,123,125,127,130,132,135,137,140,143],{"class":39,"line":124},7,[37,126,44],{"class":43},[37,128,129],{"class":47}," cachorro",[37,131,52],{"class":51},[37,133,134],{"class":74}," Object",[37,136,78],{"class":55},[37,138,139],{"class":81},"create",[37,141,142],{"class":74},"(animal)",[37,144,102],{"class":55},[37,146,148,151,153,156,158,161,163],{"class":39,"line":147},8,[37,149,150],{"class":74},"cachorro",[37,152,78],{"class":55},[37,154,155],{"class":81},"latir",[37,157,52],{"class":51},[37,159,160],{"class":43}," function",[37,162,66],{"class":55},[37,164,56],{"class":55},[37,166,168,171,173,175,177,179,182,184,186],{"class":39,"line":167},9,[37,169,170],{"class":74},"  console",[37,172,78],{"class":55},[37,174,82],{"class":81},[37,176,86],{"class":85},[37,178,90],{"class":89},[37,180,181],{"class":93},"au!",[37,183,90],{"class":89},[37,185,99],{"class":85},[37,187,102],{"class":55},[37,189,191],{"class":39,"line":190},10,[37,192,114],{"class":55},[37,194,196],{"class":39,"line":195},11,[37,197,121],{"emptyLinePlaceholder":120},[37,199,201,203,205,207,209,212],{"class":39,"line":200},12,[37,202,150],{"class":74},[37,204,78],{"class":55},[37,206,155],{"class":81},[37,208,66],{"class":74},[37,210,211],{"class":55},";",[37,213,215],{"class":214},"sutJx","    \u002F\u002F \"au!\" — próprio do cachorro\n",[37,217,219,221,223,226,228,230],{"class":39,"line":218},13,[37,220,150],{"class":74},[37,222,78],{"class":55},[37,224,225],{"class":81},"respirar",[37,227,66],{"class":74},[37,229,211],{"class":55},[37,231,232],{"class":214}," \u002F\u002F \"respirando...\" — veio do prototype\n",[11,234,235,237,238,240,241,244,245,78],{},[23,236,150],{}," não tem ",[23,239,225],{},". O JavaScript sobe pela cadeia de protótipos até encontrar em ",[23,242,243],{},"animal",". Isso se chama ",[246,247,248],"strong",{},"prototype chain",[11,250,251,252,255,256,259,260,263],{},"Se não encontrar em nenhum nível, retorna ",[23,253,254],{},"undefined",". O topo da cadeia é sempre ",[23,257,258],{},"Object.prototype",", e acima dele é ",[23,261,262],{},"null",":",[28,265,270],{"className":266,"code":268,"language":269},[267],"language-text","cachorro → animal → Object.prototype → null\n","text",[23,271,268],{"__ignoreMap":33},[11,273,274],{},"É essa busca encadeada que permite compartilhar comportamento entre objetos sem copiar nada.",[15,276,278,279],{"id":277},"constructor-functions-e-o-prototype","Constructor functions e o ",[23,280,281],{},"prototype",[11,283,284],{},"Antes do ES6, a forma padrão de criar objetos com comportamento compartilhado era via constructor functions:",[28,286,288],{"className":30,"code":287,"language":32,"meta":33,"style":33},"function Pessoa(nome) {\n  this.nome = nome;\n}\n\nPessoa.prototype.saudar = function() {\n  console.log(`Olá, sou ${this.nome}`);\n};\n\nconst p1 = new Pessoa(\"Ana\");\nconst p2 = new Pessoa(\"João\");\n\np1.saudar(); \u002F\u002F \"Olá, sou Ana\"\np2.saudar(); \u002F\u002F \"Olá, sou João\"\n",[23,289,290,308,325,330,334,357,390,394,398,425,451,455,471],{"__ignoreMap":33},[37,291,292,295,298,300,304,306],{"class":39,"line":40},[37,293,294],{"class":43},"function",[37,296,297],{"class":81}," Pessoa",[37,299,86],{"class":55},[37,301,303],{"class":302},"sk1zL","nome",[37,305,99],{"class":55},[37,307,56],{"class":55},[37,309,310,314,316,318,320,323],{"class":39,"line":59},[37,311,313],{"class":312},"swu5b","  this",[37,315,78],{"class":55},[37,317,303],{"class":74},[37,319,52],{"class":51},[37,321,322],{"class":74}," nome",[37,324,102],{"class":55},[37,326,327],{"class":39,"line":71},[37,328,329],{"class":55},"}\n",[37,331,332],{"class":39,"line":105},[37,333,121],{"emptyLinePlaceholder":120},[37,335,336,340,342,344,346,349,351,353,355],{"class":39,"line":111},[37,337,339],{"class":338},"s3afY","Pessoa",[37,341,78],{"class":55},[37,343,281],{"class":47},[37,345,78],{"class":55},[37,347,348],{"class":81},"saudar",[37,350,52],{"class":51},[37,352,160],{"class":43},[37,354,66],{"class":55},[37,356,56],{"class":55},[37,358,359,361,363,365,367,370,373,376,379,381,383,386,388],{"class":39,"line":117},[37,360,170],{"class":74},[37,362,78],{"class":55},[37,364,82],{"class":81},[37,366,86],{"class":85},[37,368,369],{"class":89},"`",[37,371,372],{"class":93},"Olá, sou ",[37,374,375],{"class":89},"${",[37,377,378],{"class":312},"this",[37,380,78],{"class":89},[37,382,303],{"class":74},[37,384,385],{"class":89},"}`",[37,387,99],{"class":85},[37,389,102],{"class":55},[37,391,392],{"class":39,"line":124},[37,393,114],{"class":55},[37,395,396],{"class":39,"line":147},[37,397,121],{"emptyLinePlaceholder":120},[37,399,400,402,405,407,410,412,414,416,419,421,423],{"class":39,"line":167},[37,401,44],{"class":43},[37,403,404],{"class":47}," p1",[37,406,52],{"class":51},[37,408,409],{"class":51}," new",[37,411,297],{"class":81},[37,413,86],{"class":74},[37,415,90],{"class":89},[37,417,418],{"class":93},"Ana",[37,420,90],{"class":89},[37,422,99],{"class":74},[37,424,102],{"class":55},[37,426,427,429,432,434,436,438,440,442,445,447,449],{"class":39,"line":190},[37,428,44],{"class":43},[37,430,431],{"class":47}," p2",[37,433,52],{"class":51},[37,435,409],{"class":51},[37,437,297],{"class":81},[37,439,86],{"class":74},[37,441,90],{"class":89},[37,443,444],{"class":93},"João",[37,446,90],{"class":89},[37,448,99],{"class":74},[37,450,102],{"class":55},[37,452,453],{"class":39,"line":195},[37,454,121],{"emptyLinePlaceholder":120},[37,456,457,460,462,464,466,468],{"class":39,"line":200},[37,458,459],{"class":74},"p1",[37,461,78],{"class":55},[37,463,348],{"class":81},[37,465,66],{"class":74},[37,467,211],{"class":55},[37,469,470],{"class":214}," \u002F\u002F \"Olá, sou Ana\"\n",[37,472,473,476,478,480,482,484],{"class":39,"line":218},[37,474,475],{"class":74},"p2",[37,477,78],{"class":55},[37,479,348],{"class":81},[37,481,66],{"class":74},[37,483,211],{"class":55},[37,485,486],{"class":214}," \u002F\u002F \"Olá, sou João\"\n",[11,488,489,491,492,495,496,499,500,502,503,505,506,508],{},[23,490,348],{}," não está em cada instância. Está em ",[23,493,494],{},"Pessoa.prototype",", compartilhado entre todas. Quando você usa ",[23,497,498],{},"new",", o JavaScript faz quatro coisas em sequência: cria um objeto vazio, aponta o ",[23,501,25],{}," dele para ",[23,504,494],{},", executa a função com ",[23,507,378],{}," apontando para esse objeto e retorna o objeto.",[15,510,512],{"id":511},"classes-es6","Classes (ES6)",[11,514,515],{},"As classes introduzidas no ES6 são uma sintaxe mais limpa em cima do mesmo mecanismo. Não é um sistema novo, é açúcar sintático sobre protótipos.",[28,517,519],{"className":30,"code":518,"language":32,"meta":33,"style":33},"class Pessoa {\n  constructor(nome) {\n    this.nome = nome;\n  }\n\n  saudar() {\n    console.log(`Olá, sou ${this.nome}`);\n  }\n}\n",[23,520,521,531,544,559,563,567,576,604,608],{"__ignoreMap":33},[37,522,523,526,529],{"class":39,"line":40},[37,524,525],{"class":43},"class",[37,527,297],{"class":528},"soiBB",[37,530,56],{"class":55},[37,532,533,536,538,540,542],{"class":39,"line":59},[37,534,535],{"class":43},"  constructor",[37,537,86],{"class":55},[37,539,303],{"class":302},[37,541,99],{"class":55},[37,543,56],{"class":55},[37,545,546,549,551,553,555,557],{"class":39,"line":71},[37,547,548],{"class":312},"    this",[37,550,78],{"class":55},[37,552,303],{"class":74},[37,554,52],{"class":51},[37,556,322],{"class":74},[37,558,102],{"class":55},[37,560,561],{"class":39,"line":105},[37,562,108],{"class":55},[37,564,565],{"class":39,"line":111},[37,566,121],{"emptyLinePlaceholder":120},[37,568,569,572,574],{"class":39,"line":117},[37,570,571],{"class":62},"  saudar",[37,573,66],{"class":55},[37,575,56],{"class":55},[37,577,578,580,582,584,586,588,590,592,594,596,598,600,602],{"class":39,"line":124},[37,579,75],{"class":74},[37,581,78],{"class":55},[37,583,82],{"class":81},[37,585,86],{"class":85},[37,587,369],{"class":89},[37,589,372],{"class":93},[37,591,375],{"class":89},[37,593,378],{"class":312},[37,595,78],{"class":89},[37,597,303],{"class":74},[37,599,385],{"class":89},[37,601,99],{"class":85},[37,603,102],{"class":55},[37,605,606],{"class":39,"line":147},[37,607,108],{"class":55},[37,609,610],{"class":39,"line":167},[37,611,329],{"class":55},[11,613,614,615,617,618,620,621,78],{},"Por baixo, ",[23,616,348],{}," ainda vai para ",[23,619,494],{},". O mecanismo é idêntico ao das constructor functions. A diferença é legibilidade e algumas proteções extras, como não poder chamar a classe sem ",[23,622,498],{},[15,624,626],{"id":625},"herança","Herança",[11,628,629,630,633],{},"Herança em JavaScript é prototípica: um objeto herda de outro objeto. O ",[23,631,632],{},"extends"," configura essa cadeia.",[28,635,637],{"className":30,"code":636,"language":32,"meta":33,"style":33},"class Animal {\n  constructor(nome) {\n    this.nome = nome;\n  }\n\n  respirar() {\n    console.log(`${this.nome} está respirando`);\n  }\n}\n\nclass Cachorro extends Animal {\n  latir() {\n    console.log(`${this.nome} está latindo`);\n  }\n}\n\nconst rex = new Cachorro(\"Rex\");\nrex.respirar(); \u002F\u002F herdado de Animal\nrex.latir();    \u002F\u002F próprio de Cachorro\n",[23,638,639,648,660,674,678,682,690,721,725,729,733,747,756,785,790,795,800,827,844],{"__ignoreMap":33},[37,640,641,643,646],{"class":39,"line":40},[37,642,525],{"class":43},[37,644,645],{"class":528}," Animal",[37,647,56],{"class":55},[37,649,650,652,654,656,658],{"class":39,"line":59},[37,651,535],{"class":43},[37,653,86],{"class":55},[37,655,303],{"class":302},[37,657,99],{"class":55},[37,659,56],{"class":55},[37,661,662,664,666,668,670,672],{"class":39,"line":71},[37,663,548],{"class":312},[37,665,78],{"class":55},[37,667,303],{"class":74},[37,669,52],{"class":51},[37,671,322],{"class":74},[37,673,102],{"class":55},[37,675,676],{"class":39,"line":105},[37,677,108],{"class":55},[37,679,680],{"class":39,"line":111},[37,681,121],{"emptyLinePlaceholder":120},[37,683,684,686,688],{"class":39,"line":117},[37,685,63],{"class":62},[37,687,66],{"class":55},[37,689,56],{"class":55},[37,691,692,694,696,698,700,703,705,707,709,712,715,717,719],{"class":39,"line":124},[37,693,75],{"class":74},[37,695,78],{"class":55},[37,697,82],{"class":81},[37,699,86],{"class":85},[37,701,702],{"class":89},"`${",[37,704,378],{"class":312},[37,706,78],{"class":89},[37,708,303],{"class":74},[37,710,711],{"class":89},"}",[37,713,714],{"class":93}," está respirando",[37,716,369],{"class":89},[37,718,99],{"class":85},[37,720,102],{"class":55},[37,722,723],{"class":39,"line":147},[37,724,108],{"class":55},[37,726,727],{"class":39,"line":167},[37,728,329],{"class":55},[37,730,731],{"class":39,"line":190},[37,732,121],{"emptyLinePlaceholder":120},[37,734,735,737,740,743,745],{"class":39,"line":195},[37,736,525],{"class":43},[37,738,739],{"class":528}," Cachorro",[37,741,742],{"class":43}," extends",[37,744,645],{"class":528},[37,746,56],{"class":55},[37,748,749,752,754],{"class":39,"line":200},[37,750,751],{"class":62},"  latir",[37,753,66],{"class":55},[37,755,56],{"class":55},[37,757,758,760,762,764,766,768,770,772,774,776,779,781,783],{"class":39,"line":218},[37,759,75],{"class":74},[37,761,78],{"class":55},[37,763,82],{"class":81},[37,765,86],{"class":85},[37,767,702],{"class":89},[37,769,378],{"class":312},[37,771,78],{"class":89},[37,773,303],{"class":74},[37,775,711],{"class":89},[37,777,778],{"class":93}," está latindo",[37,780,369],{"class":89},[37,782,99],{"class":85},[37,784,102],{"class":55},[37,786,788],{"class":39,"line":787},14,[37,789,108],{"class":55},[37,791,793],{"class":39,"line":792},15,[37,794,329],{"class":55},[37,796,798],{"class":39,"line":797},16,[37,799,121],{"emptyLinePlaceholder":120},[37,801,803,805,808,810,812,814,816,818,821,823,825],{"class":39,"line":802},17,[37,804,44],{"class":43},[37,806,807],{"class":47}," rex",[37,809,52],{"class":51},[37,811,409],{"class":51},[37,813,739],{"class":81},[37,815,86],{"class":74},[37,817,90],{"class":89},[37,819,820],{"class":93},"Rex",[37,822,90],{"class":89},[37,824,99],{"class":74},[37,826,102],{"class":55},[37,828,830,833,835,837,839,841],{"class":39,"line":829},18,[37,831,832],{"class":74},"rex",[37,834,78],{"class":55},[37,836,225],{"class":81},[37,838,66],{"class":74},[37,840,211],{"class":55},[37,842,843],{"class":214}," \u002F\u002F herdado de Animal\n",[37,845,847,849,851,853,855,857],{"class":39,"line":846},19,[37,848,832],{"class":74},[37,850,78],{"class":55},[37,852,155],{"class":81},[37,854,66],{"class":74},[37,856,211],{"class":55},[37,858,859],{"class":214},"    \u002F\u002F próprio de Cachorro\n",[11,861,862],{},"A cadeia de protótipos fica assim:",[28,864,867],{"className":865,"code":866,"language":269},[267],"rex → Cachorro.prototype → Animal.prototype → Object.prototype → null\n",[23,868,866],{"__ignoreMap":33},[11,870,871,872,875,876,878,879,882,883,886],{},"Quando você chama ",[23,873,874],{},"rex.respirar()",", o JavaScript não encontra em ",[23,877,832],{},", não encontra em ",[23,880,881],{},"Cachorro.prototype",", encontra em ",[23,884,885],{},"Animal.prototype"," e executa.",[15,888,890],{"id":889},"super",[23,891,889],{},[11,893,894],{},"Usado para acessar o constructor ou métodos da classe pai:",[28,896,898],{"className":30,"code":897,"language":32,"meta":33,"style":33},"class Animal {\n  constructor(nome) {\n    this.nome = nome;\n  }\n\n  descrever() {\n    return `Sou ${this.nome}`;\n  }\n}\n\nclass Cachorro extends Animal {\n  constructor(nome, raca) {\n    super(nome);\n    this.raca = raca;\n  }\n\n  descrever() {\n    return `${super.descrever()}, da raça ${this.raca}`;\n  }\n}\n\nconst rex = new Cachorro(\"Rex\", \"Labrador\");\nrex.descrever(); \u002F\u002F \"Sou Rex, da raça Labrador\"\n",[23,899,900,908,920,934,938,942,951,975,979,983,987,999,1017,1030,1045,1049,1053,1061,1095,1099,1104,1109,1144],{"__ignoreMap":33},[37,901,902,904,906],{"class":39,"line":40},[37,903,525],{"class":43},[37,905,645],{"class":528},[37,907,56],{"class":55},[37,909,910,912,914,916,918],{"class":39,"line":59},[37,911,535],{"class":43},[37,913,86],{"class":55},[37,915,303],{"class":302},[37,917,99],{"class":55},[37,919,56],{"class":55},[37,921,922,924,926,928,930,932],{"class":39,"line":71},[37,923,548],{"class":312},[37,925,78],{"class":55},[37,927,303],{"class":74},[37,929,52],{"class":51},[37,931,322],{"class":74},[37,933,102],{"class":55},[37,935,936],{"class":39,"line":105},[37,937,108],{"class":55},[37,939,940],{"class":39,"line":111},[37,941,121],{"emptyLinePlaceholder":120},[37,943,944,947,949],{"class":39,"line":117},[37,945,946],{"class":62},"  descrever",[37,948,66],{"class":55},[37,950,56],{"class":55},[37,952,953,957,960,963,965,967,969,971,973],{"class":39,"line":124},[37,954,956],{"class":955},"s3Er8","    return",[37,958,959],{"class":89}," `",[37,961,962],{"class":93},"Sou ",[37,964,375],{"class":89},[37,966,378],{"class":312},[37,968,78],{"class":89},[37,970,303],{"class":74},[37,972,385],{"class":89},[37,974,102],{"class":55},[37,976,977],{"class":39,"line":147},[37,978,108],{"class":55},[37,980,981],{"class":39,"line":167},[37,982,329],{"class":55},[37,984,985],{"class":39,"line":190},[37,986,121],{"emptyLinePlaceholder":120},[37,988,989,991,993,995,997],{"class":39,"line":195},[37,990,525],{"class":43},[37,992,739],{"class":528},[37,994,742],{"class":43},[37,996,645],{"class":528},[37,998,56],{"class":55},[37,1000,1001,1003,1005,1007,1010,1013,1015],{"class":39,"line":200},[37,1002,535],{"class":43},[37,1004,86],{"class":55},[37,1006,303],{"class":302},[37,1008,1009],{"class":55},",",[37,1011,1012],{"class":302}," raca",[37,1014,99],{"class":55},[37,1016,56],{"class":55},[37,1018,1019,1022,1024,1026,1028],{"class":39,"line":218},[37,1020,1021],{"class":47},"    super",[37,1023,86],{"class":85},[37,1025,303],{"class":74},[37,1027,99],{"class":85},[37,1029,102],{"class":55},[37,1031,1032,1034,1036,1039,1041,1043],{"class":39,"line":787},[37,1033,548],{"class":312},[37,1035,78],{"class":55},[37,1037,1038],{"class":74},"raca",[37,1040,52],{"class":51},[37,1042,1012],{"class":74},[37,1044,102],{"class":55},[37,1046,1047],{"class":39,"line":792},[37,1048,108],{"class":55},[37,1050,1051],{"class":39,"line":797},[37,1052,121],{"emptyLinePlaceholder":120},[37,1054,1055,1057,1059],{"class":39,"line":802},[37,1056,946],{"class":62},[37,1058,66],{"class":55},[37,1060,56],{"class":55},[37,1062,1063,1065,1068,1070,1072,1075,1078,1080,1083,1085,1087,1089,1091,1093],{"class":39,"line":829},[37,1064,956],{"class":955},[37,1066,1067],{"class":89}," `${",[37,1069,889],{"class":47},[37,1071,78],{"class":89},[37,1073,1074],{"class":81},"descrever",[37,1076,66],{"class":1077},"ssI5v",[37,1079,711],{"class":89},[37,1081,1082],{"class":93},", da raça ",[37,1084,375],{"class":89},[37,1086,378],{"class":312},[37,1088,78],{"class":89},[37,1090,1038],{"class":74},[37,1092,385],{"class":89},[37,1094,102],{"class":55},[37,1096,1097],{"class":39,"line":846},[37,1098,108],{"class":55},[37,1100,1102],{"class":39,"line":1101},20,[37,1103,329],{"class":55},[37,1105,1107],{"class":39,"line":1106},21,[37,1108,121],{"emptyLinePlaceholder":120},[37,1110,1112,1114,1116,1118,1120,1122,1124,1126,1128,1130,1132,1135,1138,1140,1142],{"class":39,"line":1111},22,[37,1113,44],{"class":43},[37,1115,807],{"class":47},[37,1117,52],{"class":51},[37,1119,409],{"class":51},[37,1121,739],{"class":81},[37,1123,86],{"class":74},[37,1125,90],{"class":89},[37,1127,820],{"class":93},[37,1129,90],{"class":89},[37,1131,1009],{"class":55},[37,1133,1134],{"class":89}," \"",[37,1136,1137],{"class":93},"Labrador",[37,1139,90],{"class":89},[37,1141,99],{"class":74},[37,1143,102],{"class":55},[37,1145,1147,1149,1151,1153,1155,1157],{"class":39,"line":1146},23,[37,1148,832],{"class":74},[37,1150,78],{"class":55},[37,1152,1074],{"class":81},[37,1154,66],{"class":74},[37,1156,211],{"class":55},[37,1158,1159],{"class":214}," \u002F\u002F \"Sou Rex, da raça Labrador\"\n",[11,1161,1162,1163,1166,1167,1170,1171,1173,1174,1176,1177,78],{},"Sem o ",[23,1164,1165],{},"super()"," no constructor de uma classe filha, o JavaScript lança um ",[23,1168,1169],{},"ReferenceError",". Ele precisa ser chamado antes de qualquer uso de ",[23,1172,378],{},", porque é o ",[23,1175,889],{}," que cria o objeto e vincula o ",[23,1178,378],{},[15,1180,1182],{"id":1181},"pontos-que-costumam-confundir","Pontos que costumam confundir",[1184,1185,1187,1189,1190],"h3",{"id":1186},"prototype-vs-__proto__",[23,1188,281],{}," vs ",[23,1191,1192],{},"__proto__",[11,1194,1195],{},"São coisas diferentes com nomes parecidos, o que gera bastante confusão.",[11,1197,1198,1200,1201,1204,1205,1207,1208,1211,1212,78],{},[23,1199,494],{}," é a propriedade da função construtora, o objeto onde os métodos compartilhados ficam. ",[23,1202,1203],{},"instancia.__proto__"," é a referência interna do objeto criado, que aponta para ",[23,1206,494],{},". Na prática, ",[23,1209,1210],{},"p1.__proto__ === Pessoa.prototype"," é ",[23,1213,1214],{},"true",[11,1216,1217,1218,1221,1222,1224],{},"A forma oficial de acessar o prototype de um objeto é ",[23,1219,1220],{},"Object.getPrototypeOf(instancia)",". O ",[23,1223,1192],{}," funciona nos browsers modernos, mas é considerado legado.",[1184,1226,1228],{"id":1227},"herança-não-copia-referencia","Herança não copia, referencia",[11,1230,1231,1232,1235],{},"Diferente de algumas linguagens, JavaScript não copia os métodos para cada instância. Todas as instâncias referenciam o mesmo objeto no prototype. Isso é eficiente em memória, mas significa que se você alterar ",[23,1233,1234],{},"Pessoa.prototype.saudar"," em runtime, todas as instâncias já existentes são afetadas imediatamente.",[1184,1237,1239],{"id":1238},"propriedades-no-objeto-vs-no-prototype","Propriedades no objeto vs no prototype",[28,1241,1243],{"className":30,"code":1242,"language":32,"meta":33,"style":33},"class Pessoa {\n  constructor(nome) {\n    this.nome = nome; \u002F\u002F cada instância tem a sua cópia\n  }\n\n  saudar() {}        \u002F\u002F compartilhado no prototype\n}\n",[23,1244,1245,1253,1265,1282,1286,1290,1302],{"__ignoreMap":33},[37,1246,1247,1249,1251],{"class":39,"line":40},[37,1248,525],{"class":43},[37,1250,297],{"class":528},[37,1252,56],{"class":55},[37,1254,1255,1257,1259,1261,1263],{"class":39,"line":59},[37,1256,535],{"class":43},[37,1258,86],{"class":55},[37,1260,303],{"class":302},[37,1262,99],{"class":55},[37,1264,56],{"class":55},[37,1266,1267,1269,1271,1273,1275,1277,1279],{"class":39,"line":71},[37,1268,548],{"class":312},[37,1270,78],{"class":55},[37,1272,303],{"class":74},[37,1274,52],{"class":51},[37,1276,322],{"class":74},[37,1278,211],{"class":55},[37,1280,1281],{"class":214}," \u002F\u002F cada instância tem a sua cópia\n",[37,1283,1284],{"class":39,"line":105},[37,1285,108],{"class":55},[37,1287,1288],{"class":39,"line":111},[37,1289,121],{"emptyLinePlaceholder":120},[37,1291,1292,1294,1296,1299],{"class":39,"line":117},[37,1293,571],{"class":62},[37,1295,66],{"class":55},[37,1297,1298],{"class":55}," {}",[37,1300,1301],{"class":214},"        \u002F\u002F compartilhado no prototype\n",[37,1303,1304],{"class":39,"line":124},[37,1305,329],{"class":55},[11,1307,1308,1309,1311,1312,78],{},"Propriedades definidas no constructor com ",[23,1310,378],{}," ficam no próprio objeto. Métodos definidos no corpo da classe ficam no prototype. Essa distinção importa quando você inspeciona objetos no DevTools ou usa ",[23,1313,1314],{},"hasOwnProperty",[15,1316,1318],{"id":1317},"conclusão","Conclusão",[11,1320,1321,1322,1324,1325,1327],{},"O sistema de protótipos é o que está por baixo de toda orientação a objetos em JavaScript, incluindo as classes do ES6. Quando você chama um método, o JavaScript percorre a cadeia de protótipos até encontrá-lo ou retornar ",[23,1323,254],{},". Quando você usa ",[23,1326,632],{},", está configurando essa cadeia.",[11,1329,1330,1331,1211,1334,1336],{},"Entender isso explica por que ",[23,1332,1333],{},"instancia.__proto__ === Classe.prototype",[23,1335,1214],{},", por que métodos são compartilhados em memória entre instâncias e por que alterar o prototype em runtime afeta todos os objetos que o referenciam.",[11,1338,1339],{},"As classes não escondem os protótipos. Elas só tornam a sintaxe mais legível.",[15,1341,1343],{"id":1342},"referências","Referências",[1345,1346,1347,1357,1364],"ul",{},[1348,1349,1350],"li",{},[1351,1352,1356],"a",{"href":1353,"rel":1354},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fpt-BR\u002Fdocs\u002FWeb\u002FJavaScript\u002FInheritance_and_the_prototype_chain",[1355],"nofollow","Herança e cadeia de protótipos - MDN Web Docs",[1348,1358,1359],{},[1351,1360,1363],{"href":1361,"rel":1362},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fpt-BR\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FClasses",[1355],"Classes - MDN Web Docs",[1348,1365,1366],{},[1351,1367,1370],{"href":1368,"rel":1369},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fpt-BR\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FGlobal_Objects\u002FObject\u002Fcreate",[1355],"Object.create() - MDN Web Docs",[1372,1373,1374],"style",{},"html pre.shiki code .sFsEu, html code.shiki .sFsEu{--shiki-light:#9C3EDA;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .sVPC0, html code.shiki .sVPC0{--shiki-light:#90A4AE;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .sFfmW, html code.shiki .sFfmW{--shiki-light:#39ADB5;--shiki-default:#F97583;--shiki-dark:#F97583}html pre.shiki code .sG-J9, html code.shiki .sG-J9{--shiki-light:#39ADB5;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .s0u7J, html code.shiki .s0u7J{--shiki-light:#E53935;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sMo7A, html code.shiki .sMo7A{--shiki-light:#90A4AE;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sK_r7, html code.shiki .sK_r7{--shiki-light:#6182B8;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .sdv8B, html code.shiki .sdv8B{--shiki-light:#E53935;--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8}html pre.shiki code .sF_wb, html code.shiki .sF_wb{--shiki-light:#39ADB5;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .s0vBq, html code.shiki .s0vBq{--shiki-light:#91B859;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sk1zL, html code.shiki .sk1zL{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#FFAB70;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .swu5b, html code.shiki .swu5b{--shiki-light:#39ADB5;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .s3afY, html code.shiki .s3afY{--shiki-light:#E2931D;--shiki-default:#79B8FF;--shiki-dark:#79B8FF}html pre.shiki code .soiBB, html code.shiki .soiBB{--shiki-light:#E2931D;--shiki-default:#B392F0;--shiki-dark:#B392F0}html pre.shiki code .s3Er8, html code.shiki .s3Er8{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#F97583;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .ssI5v, html code.shiki .ssI5v{--shiki-light:#90A4AE;--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF}",{"title":33,"searchDepth":59,"depth":59,"links":1376},[1377,1378,1380,1381,1382,1383,1389,1390],{"id":17,"depth":59,"text":18},{"id":277,"depth":59,"text":1379},"Constructor functions e o prototype",{"id":511,"depth":59,"text":512},{"id":625,"depth":59,"text":626},{"id":889,"depth":59,"text":889},{"id":1181,"depth":59,"text":1182,"children":1384},[1385,1387,1388],{"id":1186,"depth":71,"text":1386},"prototype vs __proto__",{"id":1227,"depth":71,"text":1228},{"id":1238,"depth":71,"text":1239},{"id":1317,"depth":59,"text":1318},{"id":1342,"depth":59,"text":1343},"2026-04-08T20:12:00-03:00","JavaScript não tem herança clássica como Java ou C#. Tem algo diferente: um sistema de protótipos onde objetos herdam de outros objetos. Entender essa diferença muda como você lê e escreve orientação a objetos em JS.","md","\u002Fimages\u002Fblog\u002Fprototype-heranca.png",{},"\u002Fblog\u002Fjavascript-prototype-e-heranca-com",{"title":5,"description":1392},"blog\u002Fjavascript-prototype-e-heranca-com",[1400,1401,1402],"javascript","frontend","fundamentos","ZJkSudUicmsSyuvAbcbifgHer1mCyi8nLeXP7ypfytM",1776377614449]