/ / aký je rozdiel medzi týmito dvoma reprezentáciami metód v js - javascript, json

aký je rozdiel medzi týmito dvoma reprezentáciami metód v js - javascript, json

Vyvíjam webovú stránku. Dospel som k záveru, že potrebujem vybudovať trochu komplexnejší rámec pre svoj javascriptový kód. Začal som skúmať iný príklad toho, ako napísať knižnicu javascript. Prišiel som s trochu mätúce spôsoby, ako zapísať metódy. Ja by som naozaj ocenil nejaké objasnenie.

Tak tu je, ako by som normálne zapísal metódu:

var ReportEnhancements =
function () {
this.Name = function()
{
alert("It is me!");
}
}

A tu je ďalší spôsob, ako reprezentovať metódy:

 ReportEnhancements.prototype.Tooltip = {
setByTitle :function(elementsToTooltip) {
alert("I am about to be tooltiped!")
}
}

Existujú dve veci, ktoré ma logujú:

  1. Kedy by som mal používať kľúčové slovo prototyp? Kedy by som mal len deklarovať metódu do mena člena?
  2. Pozrite sa na setByTitle a Name, ako vidíte, sú rozdielne, aj keď obidve metódy deklarujú a obe metódy sú verejné.
  3. Prečo je rozdiel medzi this.Name = function () a setByTitle: function (). Prečo existujú dve rôzne syntaxe na deklarovanie metód?

edit:

Blížim sa k pochopeniuRozdiely, ale je tu jedna veľká otázka, ktorú som ešte úplne nepochopil. Prečo tieto dva spôsoby reprezentujú metódy, a teda triedy majú dve odlišné pravidlá prístupu. Nemôžem vyhlásiť súkromnú metódu v javascriptovom objektovom literále. Inak, ak mám pravidelný vnorený prvok, nemôžem ho vystaviť ako verejný modifikátor. Čo je to s modifikátormi prístupu?

Ďakujem!

odpovede:

2 pre odpoveď č. 1

Jeden významný rozdiel (aj keď to nie je odpoveď na prečo jeden z nich je výhodný).

V \ t this.Name() má prístup k iným premenným deklarovaným vo vonkajšej funkcii, pretože je to všetko jedno uzavretie. Je známe ako "privilegovaná metóda".

Druhá verzia, ktorá bola deklarovaná úplne mimo pôvodného rozsahu, nemá prístup k týmto "súkromným" členským premenným.

Technicky je to vlastne viac pamätetáto funkcia je vytvorená iba raz. V prvej verzii je vnútorná funkcia vytvorená zakaždým, keď je objekt tohto typu inštancovaný. Ak máte len niekoľko takýchto predmetov, okolo ktorých sa to nedáva, nezáleží na tom, ale ak si ich vytvoríte, mali by ste použiť prototype metódy.

UPRAVIŤ - pokiaľ ide o úpravy o modifikátoroch prístupu:

No, vlastne nie je žiadny prístup modifikácie vôbec.

Bývalá metóda vytvára "uzavretie" a uzávery môžu obsahovať deklarácie premenných, ktoré majú iba lokálny rozsah. Funkcia je však aj objekt, takže sa pridávajú vlastnosti this vystavuje tieto vlastnosti vonkajšiemu svetu. Bežným spôsobom "exportu" metódy alebo premennej je:

var MyType = function() {
var method = function() { ... };   // this is private variable

this.method = method;              // this is a public property pointing
};                                     // to the private variable

Na druhej strane, druhá metóda s objektom doslovne nevytvára uzáver, je to len zásobník menovaných vlastností, ktorého hodnoty obsahujú odkazy na funkcie.

Všetky vlastnosti objektu môžu byť prístupné zvonku, takže všetko vytvorené objektovým literálom je implicitne "verejné".


1 pre odpoveď č. 2

S prototypom môžete upravovať štandardné javascriptové objekty. Môžete napríklad urobiť

String.prototype.encode = function () {...};

alebo

Function.prototype.declareMethod = function (param) { this.prototype [param.name] = param.functionBody; vrátiť to; };

Keďže funkcia je v reťazci prototypu, potom môžete použiť delcareMethod na čokoľvek iné.