Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using "Object.create" instead of "new"

Javascript 1.9.3 / ECMAScript 5 introduces Object.create, which Douglas Crockford amongst others has been advocating for a long time. How do I replace new in the code below with Object.create?

var UserA = function(nameParam) {     this.id = MY_GLOBAL.nextId();     this.name = nameParam; } UserA.prototype.sayHello = function() {     console.log('Hello '+ this.name); } var bob = new UserA('bob'); bob.sayHello(); 

(Assume MY_GLOBAL.nextId exists).

The best I can come up with is:

var userB = {     init: function(nameParam) {         this.id = MY_GLOBAL.nextId();         this.name = nameParam;     },     sayHello: function() {         console.log('Hello '+ this.name);     } }; var bob = Object.create(userB); bob.init('Bob'); bob.sayHello(); 

There doesn't seem to be any advantage, so I think I'm not getting it. I'm probably being too neo-classical. How should I use Object.create to create user 'bob'?

like image 955
Graham King Avatar asked Apr 25 '10 19:04

Graham King


People also ask

Should I use object create or new?

If you are more concerned with having a set prototype but the object itself is more static than not, Object. create would be a better option as it is cleaner and doesn't mess with the proto-chain in unexpected ways as the new operator does.

What does the create () method do?

create() method creates a new object, using an existing object as the prototype of the newly created object.

What is the difference between object assign and object create?

Object. assign() provides shallow copying (Only properties and methods) and it will override the method and property declared. while Object. create() provides Deep copying provides prototype chain.

What is called for new object creation?

Instantiation: The new keyword is a Java operator that creates the object. As discussed below, this is also known as instantiating a class. Initialization: The new operator is followed by a call to a constructor.


1 Answers

With only one level of inheritance, your example may not let you see the real benefits of Object.create.

This methods allows you to easily implement differential inheritance, where objects can directly inherit from other objects.

On your userB example, I don't think that your init method should be public or even exist, if you call again this method on an existing object instance, the id and name properties will change.

Object.create lets you initialize object properties using its second argument, e.g.:

var userB = {   sayHello: function() {     console.log('Hello '+ this.name);   } };  var bob = Object.create(userB, {   'id' : {     value: MY_GLOBAL.nextId(),     enumerable:true // writable:false, configurable(deletable):false by default   },   'name': {     value: 'Bob',     enumerable: true   } }); 

As you can see, the properties can be initialized on the second argument of Object.create, with an object literal using a syntax similar to the used by the Object.defineProperties and Object.defineProperty methods.

It lets you set the property attributes (enumerable, writable, or configurable), which can be really useful.

like image 82
Christian C. Salvadó Avatar answered Sep 18 '22 04:09

Christian C. Salvadó