2016-05-09 6 views
6

Was ist der Unterschied zwischen __proto__ und prototypeEinstellwerte __proto__` und `Prototyp in Javascript

ich die meisten Artikel im Web zu lesen, und ich kann es immer noch nicht verstehen .. soweit ich verstehen __proto__ ist die Eigenschaft, die für Prototyp-Objekt ist ist das eigentliche Objekt bin ich richtig? ....

Warum nur Funktionen prototypische Eigenschaften haben? Und wie ist es ein Objekt?

var fn = function(){}; 
console.dir(fn); 



Ausgang

function fn() 
    arguments: null 
    caller: null 
    length: 0 
    name: "" 
    prototype: Object 
    __proto__:() 
    <function scope> 

Verwenden von Objekt und die Funktion I versuchen Werte zu setzen für __proto__
und Prototypen in Chromkonsole, wie unten gezeigt



Ausgang

Object 
     name: "ss", 
     __proto__: Object 

//set the values 
o.__proto__ = 'aaa'; 
o.prototype = 'bbb'; 

//after set the values display the object 
console.dir(o); 



Ausgang

Object 
     name: "ss", 
     prototype: "aaa", 
     __proto__: Object 

//create function and display it 
var fn = function(){}; 
console.dir(fn); 


Ausgang

function fn() 
    arguments: null 
    caller: null 
    length: 0 
    name: "" 
    prototype: Object 
    __proto__:() 
    <function scope> 



Ausgang

function fn() 
    arguments: null 
    caller: null 
    length: 0 
    name: "" 
    prototype: "fff" 
    __proto__: function() 
    <function scope> 


Dann merke ich, dass ich keine Werte für __proto__ einstellen, sondern kann Werte prototype gesetzt. W warum kann ich keine Werte für __proto__ ???

+0

Ein 'Die Funktion .prototype' Eigenschaft nicht die Funktion selbst beeinflussen, es bezieht sich auf das Objekt, das der Prototyp für Objekte werden wird, die durch den Aufruf dieser Funktion mit' new' instanziiert . Die Eigenschaft ".__ proto__" eines Objekts bezieht sich auf den tatsächlichen Prototyp dieses Objekts. Das heißt, Fn.prototype === (new Fn()) .__ proto__'. – nnnnnn

Antwort

2

Das ist eigentlich ziemlich einfach.

  1. {object}.__proto__ ist eine Referenz auf {constructor function}.prototype Objekt.
  2. Operator new {constructor function} (params) in JavaScript hat drei wichtige Dinge:
    1. neues Objekt erstellt, lassen Sie es 'obj' sein.
    2. Aufrufe, die {constructor function} mit this auf dieses Neugeborene Objekt (Obj) festgelegt.
    3. Sets obj.__proto__ = {constructor function}.prototype;

Und das ist es ziemlich viel.

Das obj.__proto__ erstellt eine einzelne verkettete Liste zum Suchen nach Eigenschaften, die nicht im Objekt selbst definiert sind. Da es auf {constructor function}.prototype Objekt gesetzt ist, können wir diesen Prototyp als "Rack" für Objektmethoden behandeln - Funktionen, die mit Objektinstanzen verknüpft sind.

Beispiel:

function Foo() {} 
Foo.prototype.bar = function() { return "foo.bar here"; } 

var obj = new Foo(); // creating object with __proto__ set to Foo.prototype; 

obj.bar(); // will return "foo.bar here" 
2

In den meisten Sprachen gibt es Klassen und Objekte. Klassen erben von anderen Klassen.

In JavaScript

Die Vererbung ist Prototyp-basiert. Das bedeutet, dass es keine Klassen gibt. Stattdessen erbt ein Objekt von einem anderen Objekt

Vererbung, die __proto__

Wenn ein Objekt Kaninchen erbt von einem anderen Objekt Tier, in JavaScript, das bedeutet, dass es eine besondere Eigenschaft ist rabbit.__proto__ = animal.

enter image description here

Wenn ein Kaninchen Eigenschaft zugegriffen wird, und der Dolmetscher kann es nicht in Kaninchen finden, es folgt den __proto__ Link und sucht in Tiere.

var animal = { eats: true } 
var rabbit = { jumps: true } 
rabbit.__proto__ = animal // inherit 
alert(rabbit.eats) // true 

Der Prototyp

Eine neue Funktion ruft die Sätze der __proto__ des Objekts zu dem Wert seiner Eigenschaft prototype.

var animal = { eats: true } 
function Rabbit(name) { 
    this.name = name 
} 
Rabbit.prototype = animal 
var rabbit = new Rabbit('John') 
alert(rabbit.eats) 

Complete Reference.