4

I'm trying to use Object.Create in JavaScript. I currently have the following code:

var vehicle = {
        getModel: function () {
        console.log( "The model of this vehicle is.." + this.model );
    }
};

var car = Object.create(vehicle, {
    "id": {
       value: 9,         
    },
    "model": {
       value: "Ford",  
    }
});

var van = Object.create(vehicle, {
  "id": {
     value: 10,    
   },
    "model": {
      value: "Big Van",
      enumerable: true
   },
    "make": {
      value: "Warrior",      
   },
    "getMake": function () {
       console.log( "The make of this vehicle is.." + this.make );
   }
});

I've tried to add a function to van for getMake but I get the error:

TypeError: Property 'getMake' of object # is not a function when I call:

van.getMake();

Is this possible? How do you do it?

hippietrail
  • 15,848
  • 18
  • 99
  • 158
davy
  • 4,474
  • 10
  • 48
  • 71

2 Answers2

6

Properties created that way are not enumerable by default. This may be causing your issue.

Try this(untested):

"getMake": { value: function () {
       console.log( "The make of this vehicle is.." + this.make )
   }, enumerable: true };

Edit It looks like this is working because we are passing an object and not just the value. The enumerable is unnecessary.

Ryan O'Neill
  • 1,710
  • 2
  • 13
  • 24
  • 2
    No need for the property to be enumerable. – Denys Séguret Nov 26 '12 at 13:04
  • 2
    I'm with @dystroy, I'd even argue that the property is best defined as `enumerable: false`, when iterating an object (`for (var p in obj)`), you generally don't want to deal with the methods – Elias Van Ootegem Nov 26 '12 at 13:06
  • But the default behaviour is to list all enumerable properties, and methods are enumerable by default.So its good to go with the enumerable:true as it is more towards the expected default behaviour. – Mahendra Singh Jul 25 '19 at 18:48
2

You need to pass an object defining the property, not just the value :

 "getMake": {value:function () {
     console.log( "The make of this vehicle is.." + this.make );
 }}

Reference

Note that the usual way to do OOP in Javascript isn't in using Object.create but in using prototype.

Denys Séguret
  • 372,613
  • 87
  • 782
  • 758
  • In my own opinion it's ugly, useless and **[slow](http://jsperf.com/object-create-vs-constructor-vs-object-literal/7)**. But, as most js coders I never use Object.create so I may miss some of its advantages. – Denys Séguret Nov 26 '12 at 14:30