web-dev-qa-db-fra.com

JavaScript créant une nouvelle instance d'objets

Je conçois donc une interface de livre de notes et j'ai un cours défini comme suit:

<script>
course = new Object();
 var name;
 var gradingareas;
 var finalgrade;
</script>

alors plus tard, je veux créer une nouvelle instance:

 var gradingareas = new Array("Homework", "Classwork", "Exams");

 course1 = new course("CS1500", gradingareas, 85);

J'ai aussi essayé sans le var devant en vain. Je reçois un "TypeError Uncaught: Object n'est pas une fonction" Je suis très nouveau en javascript, donc je ne sais même pas si j'y vais de la bonne façon. Toute aide est la bienvenue, merci. 

20
user1991562

Votre code existant:

// Creates a new, empty object, as a global
course = new Object();
// Creates three new variables in the global scope.
var name;
var gradingareas;
var finalgrade;

Il n'y a pas de lien entre les variables et l'objet.

On dirait que vous voulez quelque chose de plus semblable à:

function Course(name, gradingareas, finalgrade) {
    this.name = name;
    this.gradingareas = gradingareas;
    this.finalgrade = finalgrade;
}

Ensuite:

var course1 = new Course("CS1500", gradingareas, 85);

Notez l'utilisation d'une lettre majuscule pour nommer la fonction constructeur. Ceci est une convention dans la communauté JS.

51
Quentin

JS est prototypique, plutôt que basé sur la classe et si vous êtes novice, il est avantageux d'apprendre immédiatement ceci plutôt que d'essayer de créer des modèles classiques d'héritage, cependant, l'héritage classique est bien vivant dans JS.

Quoi qu'il en soit, pour répondre à vos questions concernant l'accès à vos variables:

course1.name fonctionne bien avec l'exemple ci-dessus.

Si vous souhaitez privatiser vos données, vous pouvez adopter cette approche en utilisant la clôture:

var Course = function(name, grade) {
  // Private data
  var private = {
    name: name,
    grade: grade
  }

  // Expose public API
  return {
    get: function( prop ) {
      if ( private.hasOwnProperty( prop ) ) {
        return private[ prop ];
      }
    }
  }
};

Puis instancier un nouvel objet:

var course = new Course('Programming with JavaScript', 'A');

et commencez à utiliser toutes ces données privées:

course.get('name');

Bien sûr, vous voudrez probablement que les installateurs manipulent ces données aussi;)

37
Matt Styles

Le code que vous avez décrit a les effets suivants:

// Declares a memory variable called course and stores and object in it
var course = new Object();

// Declares three variables
 var name;
 var gradingareas;
 var finalgrade;

Ces variables déclarées ne sont pas automatiquement connectées à l'objet. Si vous voulez que ces propriétés soient déclarées sur l'objet, vous avez 2 options:

  1. Déclarez les comme propriétés de l'objet
  2. Déclarez-les sur le prototype de l'objet

Exemple1: déclare-les comme propriétés de l'objet:

// Declares a memory variable called course and stores and object in it
var course = new Object();

// Access or create new properties with . or [] operator
course.name = 'math';
course.gradingareas = 'muliple';
course['finalgrade'] = 'A'

console.log(course);


Exemple2: Déclarez-les sur le prototype:

// Create a constructor function
function Course (name, grade) {
  this.name = name;
  this.grade = grade;
}

// course is added on the prototype
Course.prototype.gradingareas = 'some gradingareas';

// the name and the grade are added on the object itself
var course = new Course ('willem', 10);

console.log(course);

0