2010-10-26 2 views
3
function Person(name) { 
    this.name = name; 
    this.say = function() { 
     console.info('I am ' + this.name); 
    } 
} 
var p=new Person('stackoverflow'); 

Quelqu'un m'a dit que les codes ci-dessus sont égaux à:Comment le javascript crée-t-il un objet?

function Person(name) { 
    this.name = name; 
    this.say = function() { 
     console.info('I am ' + this.name); 
    } 
} 

var p={}; 
Person.call(p,'stackoverflow'); 

Est-ce vrai?

Si oui, qu'en est-il du prototype?

Chaque objet dans javascripte possède un prototype, et la chaîne de prototype tient la releationship des obejcts, je me demande si ce prototype fait quelque chose ou pas.

Dans cet exemple, lorsque l'objet de 'p' est créé, appelle-t-il une méthode intégrée de la super-classe de Person? Par ailleurs, ce que je veux savoir, c'est ce que fait la syntaxe var p=new Person('stackoverflow');?


mise à jour ----------------- ------------------

function Person(name) { 
    this.name = name; 
} 
Person.prototype.say = function() { 
    console.info('I am ' + this.name); 
} 

Que diriez-vous si je mets le defination de dire à l'intérieur de la fonction de la personne:

function Person(name) { 
    this.name = name; 
    Person.prototype.say = function() { 
     console.info('I am ' + this.name); 
    } 
} 

Répondre

2

le code:

var p=new Person('stackoverflow'); 

crée une nouvelle instance de la classe Person. Vous devez vous rappeler que les classes en javascript sont des fonctions, donc lorsque vous appelez:

Person.call(p,'stackoverflow'); 

Vous êtes juste d'appeler la fonction de la personne et la liaison à l'objet p (cela signifie que dans le contexte de la fonction du this se référera à la p objet). Ces morceaux de code font la même chose, sauf que le premier est une instance de la classe, donc si vous mettez à jour l'objet prototype de la personne, ses propriétés seront mises à jour.

Quoi qu'il en soit, la situation est différente lorsque vous remplissez l'objet prototype de la fonction Personne:

Person.prototype={test:"test"} 

Si vous ajoutez ceci après la déclaration de la fonction de personne, vous verrez que ces morceaux de code ont un comportement différent. L'objet initialisé avec "new" contiendra la propriété test, mais l'autre ne l'a pas. Cela se produit car l'objet prototype est appliqué uniquement aux instances de la classe lors de l'utilisation de "new".

+0

C'est-à-dire que le premier p possède le prototype de Person? – hguser

+0

Oui, car il s'agit d'une instance de Person et toutes les propriétés du prototype de Person sont appliquées à l'objet. Ajoutez 'Person.prototype = {test:" test "};' et testez avec firbug avec console.dir (p) dans les deux cas et vous verrez la différence. – mck89

+0

Merci, je l'ai testé et je le sais maintenant. :) BTW, y a-t-il un plugin dans eclipse qui peut exécuter javascript directement et autonome? – hguser

0

Eh bien, en fait

var p=new Person('stackoverflow'); 

est équivalent à:

var p={}; 
p.__proto__ = Person.prototype; 
Person.call(p,'stackoverflow'); 

sauf que __proto__ n'est pas JavaScript standard (mais est prise en charge par certaines implémentations).

Questions connexes