Skip to content

Instantly share code, notes, and snippets.

@dherman
Created July 28, 2012 18:13
Show Gist options
  • Save dherman/3194234 to your computer and use it in GitHub Desktop.
Save dherman/3194234 to your computer and use it in GitHub Desktop.
What everyone kinda wishes Object.create had been
Object.beget = (function() {
var create = Object.create,
defineProperty = Object.defineProperty;
// see https://gist.github.com/3194222
var hasOwn = Object.prototype.hasOwnProperty.unselfish();
return function beget(proto, own) {
var result = create(proto);
var descriptor = {
enumerable: true,
writable: true,
configurable: true
};
for (var key in own) {
if (!hasOwn(own, key))
continue;
descriptor.value = own[key];
defineProperty(result, key, descriptor);
}
return result;
};
})();
var root = {
method: function() { return [this.x, this.y] }
};
var o = Object.beget(root, { x: 0, y: 22 });
console.log(o.method()); // [0, 22]
@polotek
Copy link

polotek commented Jul 28, 2012

Take a look at my little protochains lib I was experimenting with. I had the same idea about adding a third param for extra properties. It has several other things I've been playing with too.

https://github.com/polotek/procstreams/blob/master/protochains.js

I don't think people will expect the complicated version of clone. I would dare to say that most of the time, people aren't dealing with complex objects. They are cloning data objects or shallow instance objects. The idea of a "deep clone" suggests more sophistication. It means you know you're dealing with complex objects. You know they may have significant proto chains. And you know whether you want those proto properties or not. And if that's the case, you should put together a sophisticated method that works the way you want, by composing these simpler methods. You should have everything you need with Object.create, Object.clone, and perhaps one of the common extend methods. My feeling is that these are simple to understand individually, but still give you lots of power and flexibility when combined.

@chevcast
Copy link

When I first started learning about Object.create I actually assumed this was how it worked. I was bewildered when things weren't working as I expected. I do wish this method were simpler.

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