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.
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.
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. */
.. 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.