1920 Stimmen

Was ist das Schlüsselwort "new" in JavaScript?

El new Schlüsselwort in JavaScript kann beim ersten Mal ziemlich verwirrend sein, da die meisten Leute denken, dass JavaScript keine objektorientierte Programmiersprache ist.

  • Was ist das?
  • Welche Probleme werden damit gelöst?
  • Wann ist es angebracht und wann nicht?

8voto

rsbkk Punkte 235

Manchmal ist Code einfacher als Worte:

var func1 = function (x) { this.x = x; }                    // used with 'new' only
var func2 = function (x) { var z={}; z.x = x; return z; }   // used both ways
func1.prototype.y = 11;
func2.prototype.y = 12;

A1 = new func1(1);      // has A1.x  AND  A1.y
A2 =     func1(1);      // undefined ('this' refers to 'window')
B1 = new func2(2);      // has B1.x  ONLY
B2 =     func2(2);      // has B2.x  ONLY

für mich, solange ich nicht Prototyp, verwende ich Stil von func2, wie es mir ein bisschen mehr Flexibilität innerhalb und außerhalb der Funktion.

3voto

erenon Punkte 18471

El new Schlüsselwort dient der Erstellung neuer Objektinstanzen. Und ja, javascript ist eine dynamische Programmiersprache, die das objektorientierte Programmierparadigma unterstützt. Die Konvention über die Objektbenennung ist, immer Großbuchstaben für Objekte zu verwenden, die durch das Schlüsselwort new instanziiert werden sollen.

obj = new Element();

3voto

khizer Punkte 910

Javascript ist keine objektorientierte Programmiersprache (OOP), weshalb die AUFBLICK Prozess in javascript arbeiten mit DELEGATIONSPROZESS". auch bekannt als prototypische Delegation oder prototypische Vererbung.

Wenn Sie versuchen, den Wert einer Eigenschaft von einem Objekt zu erhalten, das sie nicht hat, wird die JavaScript-Engine den Prototyp des Objekts (und dessen Prototyp, jeweils 1 Schritt darüber) seine Prototypenkette, bis die Kette bis zu null das ist Object.prototype == null (Standard Object Prototype). Wenn zu diesem Zeitpunkt eine Eigenschaft oder Methode nicht definiert ist, dann undefiniert zurückgegeben wird.

Wichtel!! Die Funktionen sind Funktionen sind Objekte erster Klasse

Funktionen = Funktion + Objekte Combo

Funktionsname.prototype = { shared SubObject }

{
  // other properties
  prototype: {  
   // shared space which automatically gets [[prototype]] linkage 
      when "new" keyword is used on creating instance of "Constructor 
      Function"
  }
}

So wird mit dem new Schlüsselwort für einige der Aufgaben, die manuell erledigt wurden, z. B.

  1. Manuelle Objekterstellung z.B. newObj.
  2. Versteckte Anleihe Erstellung mit proto (alias: Protoschwamm ) in der JS-Spezifikation [[Prototyp]] (d.h. proto )
  3. referenzieren und Eigenschaften zuweisen newObj
  4. Rückgabe von newObj Objekt.

Alles wird manuell erledigt.

function CreateObj(value1, value2) {
  const newObj = {};
  newObj.property1 = value1;
  newObj.property2 = value2;
  return newObj;
}
var obj = CreateObj(10,20);

obj.__proto__ === Object.prototype;              // true
Object.getPrototypeOf(obj) === Object.prototype // true

Javascript Schlüsselwort new hilft, diesen Prozess zu automatisieren:

  1. wird ein neues Objektliteral erstellt, das durch this:{}
  2. referenzieren und Eigenschaften zuweisen this
  3. Versteckte Anleihe Erstellung [[Prototyp]] (d. h. proto ) in den gemeinsamen Bereich Function.prototype.
  4. implizite Rückgabe von this Objekt {}

    function CreateObj(value1, value2) { this.property1 = value1; this.property2 = value2; }

    var obj = new CreateObj(10,20); obj.proto === CreateObj.prototype // true Object.getPrototypeOf(obj) == CreateObj.prototype // true

Aufruf der Konstruktorfunktion ohne das new-Schlüsselwort:

\=> this: Window

function CreateObj(value1, value2) {
  var isWindowObj = this === window;
  console.log("Is Pointing to Window Object", isWindowObj);
  this.property1 = value1;
  this.property2 = value2;
}
var obj = new CreateObj(10,20); // Is Pointing to Window Object false
var obj = CreateObj(10,20); // Is Pointing to Window Object true
window.property1; // 10
window.property2; // 20

2voto

eyelidlessness Punkte 60421

El new Schlüsselwort erstellt Instanzen von Objekten unter Verwendung von Funktionen als Konstruktor. Zum Beispiel:

var Foo = function() {};
Foo.prototype.bar = 'bar';

var foo = new Foo();
foo instanceof Foo; // true

Die Instanzen erben von der prototype der Konstruktorfunktion. Im obigen Beispiel also...

foo.bar; // 'bar'

2voto

João Pinho Punkte 3587

JavaScript an sich kann sich von Plattform zu Plattform stark unterscheiden, da es immer eine Implementierung der ursprünglichen Spezifikation EcmaScript ist.

Unabhängig von der Implementierung bieten alle JavaScript-Implementierungen, die die EcmaScript-Spezifikation richtig befolgen, eine objektorientierte Sprache. Gemäß dem ES-Standard:

ECMAScript ist eine objektorientierte Programmiersprache für Durchführung von Berechnungen und Manipulation von Berechnungsobjekten innerhalb einer Host-Umgebung.

Nachdem wir uns nun darauf geeinigt haben, dass JavaScript eine Implementierung von EcmaScript und damit eine objektorientierte Sprache ist. Die Definition der new Operation in jeder objektorientierten Sprache besagt, dass ein solches Schlüsselwort verwendet wird, um eine Objektinstanz von einer Klasse eines bestimmten Typs (einschließlich anonymer Typen, in Fällen wie C#) zu erstellen.

In EcmaScript verwenden wir keine Klassen, wie Sie in den Spezifikationen nachlesen können:

ECMAScript verwendet keine Klassen wie z.B. in C++, Smalltalk oder Java. Stattdessen können Objekte auf verschiedene Weise erstellt werden, unter anderem über eine literale Notation oder über Konstruktoren, die Objekte erzeugen und dann Code ausführen, der sie ganz oder teilweise initialisiert, indem er ihren Eigenschaften Werte zu ihren Eigenschaften zuweist. Jeder Konstruktor ist eine Funktion, die über eine Eigenschaft namens prototype besitzt, die zur Implementierung von prototypbasierter Vererbung und gemeinsamen Eigenschaften verwendet wird. Objekte werden erstellt durch
Verwendung von Konstruktoren in neuen Ausdrücken; zum Beispiel erzeugt new Datum(2009,11) erzeugt ein neues Datumsobjekt. Das Aufrufen eines Konstruktors ohne new zu verwenden, hat Konsequenzen, die vom Konstruktor abhängen. Zum Beispiel erzeugt Date() eine String-Darstellung des aktuellen Datums und der Uhrzeit und nicht ein Objekt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X