Skip to content

Instantly share code, notes, and snippets.

@petermichaux
Created April 25, 2012 13:29
Show Gist options
  • Save petermichaux/2489714 to your computer and use it in GitHub Desktop.
Save petermichaux/2489714 to your computer and use it in GitHub Desktop.
Function.prototype.new
Function.prototype.new = function() {
var obj = Object.create(this.prototype);
this.apply(obj, arguments);
return obj;
};
function Person(name) {
this.setName(name);
}
Person.prototype.getName = function() {
return this.name;
};
Person.prototype.setName = function(name) {
this.name = name;
};
var david = Person.new('Dave');
david.getName(); // 'Dave'
@medikoo
Copy link

medikoo commented Apr 28, 2012

Nice benchmark: http://jsperf.com/object-create-vs-crockford-vs-jorge-vs-constructor/
So solution you propose for shim instead of using native Object.create would probably be best fit:

Function.prototype.new = (function() {
  function F() {};
  return function () {
    F.prototype = this.prototype;
    var obj = new F();
    this.apply(obj, arguments);
    return obj;
  };
}());

@petermichaux
Copy link
Author

That is not an apples-to-apples perf test because the the constructor function version has the opportunity to initialize the newly created instance. When adding initialize to the Object.create version, the performance of Object.create is not much greater than the constructor version in FF12

http://jsperf.com/object-create-vs-crockford-vs-jorge-vs-constructor/31

@medikoo
Copy link

medikoo commented Apr 29, 2012

@petermichaux I'm not sure what you want to point now.
What's clear to me from any version of this benchmark is that using new is magnitudes faster than native or shimmed Object.create version. Exception is just Firefox on which it's pretty same, hopefully Chrome and Safari will have it fixed, at least I don't see any technical reason why it should be so slow there.

@abozhilov
Copy link

You have 2 big issues. Both are related with the built-in constructors and Object.create. Even and every object inherits from Object.prototype, the objects have hidden internal behavior which depends on the type of the objects. e.g arrays have special setter, functions have call and construct methods etc.

Array.new();

Will create a new native object which inherits from Array.prototype but it would not be true array, because the internal behavior is not inherited trough the prototype chain.

The second problem is again with built-ins which have non-generic methods, e.g.:

String(String.new('')); // TypeError: String.prototype.toString is not generic

@aaditmshah
Copy link

A better way to implement new is as follows: https://gist.github.com/aaditmshah/6269739

See the following StackOverflow answer: http://stackoverflow.com/a/17345713/783743

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment