webForumDet fria alternativet

Använda new?

9 svar · 754 visningar · startad av yador

yadorMedlem sedan mars 2004455 inlägg
#1

Hejsan!
Är det egentligen någon skillnad att skriva t.ex:

var a = new Function("alert(\"hejsan\");");

eller bara:

var a = Function("alert(\"hejsan\");");

För om det inte finns någon skillnad så förstår jag inte varför man ska ta med new.

Obs, detta är inte speciellt riktat vid användandet av Function utan även när man t.ex använder Array och object med mera.

Tack på förhand!

nitro2k01Medlem sedan aug. 20039 342 inlägg
#2

Skillnaden är att när du har med new så kommer JS kopiera innehållet i prototypen för metoden till det nyskapade objektet, annars inte. Betrakta följande kodexempel:

<script type="text/javascript">

function TestClass(){
	alert(this.testProperty);
}

TestClass.prototype.testProperty=5;
TestClass.prototype.testMethod=function(){
	alert("Test method called ok");
};

x = new TestClass();
x.testMethod();
</script>

Denna kod fungerar som den ser ut att göra. Om du däremot utelämnar new så kommer koden inte funka som den ska eftersom värdet och metoden inte kopieras från prototypen.
Däremot verkar inte detta gälla interna klasser såsom Array och Function, deras prototyper är åtkomliga även om objektet skapas utan new. Jag kan inte komma på någon skillnad mellan att skapa med vs utan new för objekt av de klasser som redan finns definierade i miljön.

yadorMedlem sedan mars 2004455 inlägg
#3

Okej, jag tror jag förstår :) Tack nitro2k01!

TroxyMedlem sedan mars 20041 505 inlägg
#4

I Javascript är OOP-principen lite udda eftersom man instansierar funktioner som objekt (brukar kallas för klasser i andra språk).
Så det är nyckelordet "new" som skapar en instans av en funktion istället för att bara returnera funktionens värde.
Här är ett till exempel:

function foo() {
   this.bar = function bar() {
      alert('test');
   }
}

var obj1 = new foo()
obj1.bar()

var obj2 = foo()
obj2.bar()

I exemplet ovan blir "obj1" ett objekt med egenskapen "bar", dvs. en instans av "foo".
Men "obj2" däremot blir ingenting (undefined) eftersom funktionen "foo" inte returnerar något värde.

yadorMedlem sedan mars 2004455 inlägg
#5

okej, jag tror jag förstår, men kom att tänka på en sak. Om new finns så bör väl någon delate finnas också, eller?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#6

Inget delatemen väl ett delete. delete används för att ta bort element ur de associativa arrayer som alla objekt är. delete är alltså inte motsatsen till new, utan de är semantiskt olika.
Nedanstående exempelkod visar några av egenskaperna hos delete, men det där är rejäl överkurs, och om du inte fattar något av det behöver du itne oroa dig.

x=[0,1,2,3]
delete x[1]
alert(x);	// Visar 0,,2,3 eftersom elementet med index 1 är borttaget

delete x;
alert(typeof x);	/* Visar typen undefined eftersom det nu inte finns något som
heter x i den associativa arrayen window som utgör det globala scopet */

var y=new Object();
y.testProperty=42;

delete y.testProperty;
alert(typeof y.testProperty)	/* Visar undefined eftersom elementet med index
testProperty i den associativa arrayen y är borttaget */

delete y;
alert(typeof y);	/* Visar object. Eftersom y är definierat med var, så utgör
y inte ett index i någon associativ array och därmed misslyckas borttagningen. */
spangoMedlem sedan juni 20008 205 inlägg
#7

.. och normalt brukar delete inte behövas eftersom Javascript har automagisk garbage collection.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#8

spango skrev:

.. och normalt brukar delete inte behövas eftersom Javascript har automagisk garbage collection.

Nja, delete gör inget som är direkt relaterat till GC. Det förstör inte objekt, utan bara referenser, och då bara om referensen finns i en array. Tänk dig att du har ett objekt med egenskaperna egenskap1, egenskap2 och egenskap3. Så vill du ta bort egenskap3, då är delete det enda sättet.

spangoMedlem sedan juni 20008 205 inlägg
#9

Förvisso. Poängen är att delete inte, som i t.ex. C++, är new-operatorns antites.

yadorMedlem sedan mars 2004455 inlägg
#10

okej, jag men jag förstår :) Tack för att du tog din tid och förklarade nitro2k01.

264 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
132 ms — hämta forumlista (db)
127 ms — hämta statistik (db)
135 ms — hämta tråd, inlägg och bilagor (db)