> If you do something like
> var fuz = Object.extend(foo, {paper:'in', shoes:'my'});
>
> Then fuz will get all properties of Object.prototype, again, as duplicates.
> In the above, you are clearly most interested in what you see in the literal
> and those are the own properties.
>
> I don't understand how you can get properties as duplicates in JS.
Given the following:
var target = Object.create(null); // target has not prototype
console.log(toString in target); // false
var source = { foo: 123 };
console.log(toString in source); // true
Object.extend(target, source);
console.log(toString in target); // true
Object.extend would also add all of the following properties to target (copied
from Object.prototype, which is the prototype of each object literal).
> Object.getOwnPropertyNames(Object.getPrototypeOf({}))
[ 'toString',
'__lookupGetter__',
'__defineGetter__',
'toLocaleString',
'hasOwnProperty',
'valueOf',
'__defineSetter__',
'constructor',
'propertyIsEnumerable',
'isPrototypeOf',
'__lookupSetter__' ]
> Also note that JavaScript only changes properties in the first object in a
> prototype chain:
> var proto = { foo: 3 };
> var obj = Object.create(proto);
> obj.foo = 5;
> console.log(proto.foo); // 3
>
> Fine, but not germane as far as I can tell.
Loosely, it shows that own properties have always had special status in
JavaScript (prototypes are there specifically to be shared).
> And this kind of "extend" enables poor man’s cloning as follows:
> var orig = { foo: "abc" };
> var clone = Object.extend(Object.create(Object.getPrototypeOf(orig)),
> orig);
>
> Sadly this code will fail since -- surprise! -- Object.create() does not take
> an object as the second argument.
Object.create() only has a single argument above, it creates an empty object.
>
> I would prefer the name Object.copyOwnPropertiesTo(source, target) or
> Object.copyOwnTo(source, target) to the name “extend” (which, to me, suggests
> inheritance).
>
> Since we live in a right to left world (a = b();) we need the target on the
> left. Then multiple RHS also works easily.
Swapping the parameters would is fine with me, then the name should probably be
changed to something like copyOwnFrom(target, source).
> However, note that if Object.create() were fixed:
> var clone = Object.create(Object.getPrototypeOf(orig),
> Object.getOwnProperties(orig));
I don’t see a simple way of “fixing” (property descriptors do have their uses)
Object.create(). But, in a way, the proto operator <| is that fix. However,
your are on to something with the above which will work as follows in ES.next:
var clone = Object.create(Object.getPrototypeOf(orig),
Object.getOwnPropertyDescriptors(orig));
--
Dr. Axel Rauschmayer
[email protected]
twitter.com/rauschma
home: rauschma.de
blog: 2ality.com
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss