2011-11-06 2 views
1

Je comprends un peu la différence entre Javascript et Java quand il s'agit de POO. J'ai lu le dernier paragraphe du livre Javascript que j'ai mais je ne comprends pas très bien ce que cela signifie, pouvez-vous expliquer plus en détail et fournir des exemples pour montrer la différence entre les deux langues?OOP Javascript Vs Java (ou d'autres, tels que PHP)

"Dans de nombreux langages de programmation orientés objet, il est possible de définir une classe d'objets, puis de créer des objets individuels qui sont des instances de cette classe."

Merci!

Répondre

3

Le javascript orienté objet est très simple.

Vous créez un objet.

var Klass = { 
    method: function() { 

    }, 
    constructor: function() { 

    }, 
    ... 
}; 

Et puis vous créez une instance de cet objet par héritage prototypique

// instantiate 
var o = Object.create(Klass); 
// initialize 
o.constructor(); 

Ceci est différent de OO classique parce que tout objet peut être une « classe » en javascript. et il n'y a qu'une seule chaîne d'héritage, la chaîne de prototypes.

Normalement, dans les langages OO classiques, les classes hériteraient l'une de l'autre et les instances auraient une chaîne d'héritage séparée.

Toujours dans OO classique, vous disposez de deux objets, l'objet de classe actuel et le plan de l'instance (c'est-à-dire static). Cela n'existe pas en javascript car il n'y a qu'un seul objet, le blueprint.

Avertissement:Object.create est ES5, si vous avez besoin d'un es5-shim pour les plates-formes existantes.

+5

Oh mon dieu, n'allez pas pousser votre style de prototypes-comme-classes préféré récemment-découvert sans au moins un certain avertissement ... @Meen ce que fait Raynos est fait par très peu de gens, et est le résultat d'un article C'est devenu populaire au cours du dernier mois. vous ne verrez pas beaucoup de code JavaScript dans la nature comme ça. – Domenic

+0

@Domenic C'est pratiquement la même chose. 'Klass.constructor.prototype === Klass' &&' Constructeur.prototype.constructor === Constructeur'. C'est une question de style personnel, et je trouve que c'est beaucoup plus lisible et élégant que de se fier aux constructeurs, '.prototype' et' new'. Et en fait, ce que je fais reflète les modèles d'objets es.next et les classes es.next, la communauté ES va s'éloigner des constructeurs. Et en dehors de "Ce n'est pas mon choix de style", y a-t-il quelque chose qui ne va pas dans les constructions que je montre? – Raynos

+0

Ce n'est pas du tout la même chose. Ce style sépare l'initialisation de la création via ce truc du constructeur, ce qui est une différence substantielle, et plus important encore, ce style est utilisé par très peu de gens sur la planète. Les opinions subjectives sur la lisibilité et l'élégance sont dépassées par le fait que l'OP souhaite que son code soit lisible par quelqu'un qui n'a pas lu le billet de Rauschmayer. – Domenic

9

Que la plupart des gens faire est d'utiliser les fonctions de constructeur, comme suit:

function MyClass(a, b) { 
    // Private instance properties 
    var x = "secret"; 
    var y = "also secret"; 

    // Public instance properties 
    this.a = a; 
    this.b = b; 

    // "Privileged" methods; can access private and public properties 
    this.foo = function() { 
     return x + " " + this.a; 
    }; 
} 

// "Public" methods; cannot access private properties 
MyClass.prototype.bar = function() { 
    return this.a + " " + this.b; 
}; 

// Public shared properties; not recommended: 
MyClass.prototype.w = "stuff"; 

// Static methods 
MyClass.baz = function() { 
    return "i am useless"; 
}; 

Vous pouvez ensuite utiliser cette fonction constructeur comme ceci:

var instance = new MyClass("hi", "Meen"); 

asssert.equal(instance.foo(), "secret hi"); 
assert.equal(instance.bar(), "hi Meen"); 
assert.equal(MyClass.baz(), "i am useless"); 

var also = new MyClass("hi", "Raynos"); 

instance.w = "more stuff"; 
assert.equal(also.w, "more stuff"); 

Si vous voulez faire de l'héritage, vous ferait quelque chose comme:

function Inherited(a) { 
    // apply parent constructor function 
    MyClass.call(this, a, "Domenic"); 
} 
Inherited.prototype = Object.create(MyClass.prototype); 

var inherited = new Inherited("hello there good chap"); 

assert.equal(inherited.a, "hello there good chap"); 
assert.equal(inherited.foo(), "secret hello there good chap"); 
assert.equal(inherited.bar(), "hello there good chap Domenic"); 
+1

Vous passez en revue "privé" et "privilégié" sans expliquer qu'il s'agit simplement de variables locales dans une fermeture et déduire un coût d'exécution, ainsi que de faire des OO prototypiques. Ce sont deux constructions parallèles et elles ne fonctionnent pas particulièrement bien ensemble. – Raynos

+0

Microoptimisations n'a jamais été important dans mon expérience de faire de la POO en JavaScript; être capable d'avoir l'un des quatre principes de la POO, à savoir. encapsulation, est beaucoup plus important. – Domenic

+0

Dans ce cas, vous n'avez pas besoin de OO prototypique. Vous devriez juste avoir des usines qui muent "ceci". Notez également que "encapsulation" est satisfaite par la [deuxième définition sur wikipedia] (http://en.wikipedia.org/wiki/Encapsulation_ (object-oriented_programming)). – Raynos

3

Dans Jav a vous pouvez créer une classe en utilisant le mot clé class. Une classe est le plan de ses instances (objets).

par exemple.

class AClass { // AClass is a class 
    AClass() { } //this is the constructor which will be used to create instances of this class 
} 

Et puis créez et instance de la classe:

AClass obj1 = new AClass(); // an instance of the class AClass 
AClass obj2 = new AClasss(); //another instance of the class AClass 

Ainsi, chaque objet en Java est une instance d'une classe. Et vous pouvez avoir plusieurs instances différentes d'une classe, mais vous ne pouvez pas avoir d'objet sans classe qui agit comme leur plan. Et, dans la classe, vous pouvez définir des variables membres et des méthodes qui peuvent appartenir à la classe elle-même, qui seront partagées par toutes ses instances, ou appartenir à l'instance, auquel cas chaque instance aura sa propre copie .

En Javascript pour la plupart, je crée des objets comme suit:

var obj = { }; 

Alors, je ne pas besoin de créer une classe pour créer réellement un objet.

+0

Haha, la simplicité de ta réponse me fait rire :). +1 – Domenic