Skip to content

Commit

Permalink
It turns out that Object.defineProperty can be used. Reduction of cod…
Browse files Browse the repository at this point in the history
…e size.
  • Loading branch information
Victorystick committed Jan 4, 2015
1 parent 507904f commit da3d2a6
Show file tree
Hide file tree
Showing 2 changed files with 1 addition and 84 deletions.
61 changes: 1 addition & 60 deletions es6-shim.js
Original file line number Diff line number Diff line change
Expand Up @@ -2193,63 +2193,6 @@
};
};

var isAccessorDescriptor = function (desc) {
return !!desc && ('set' in desc || 'get' in desc);
};

var isDataDescriptor = function (desc) {
return !!desc && ('value' in desc || 'writable' in desc);
};

var __defineOwnProperty = function (object, key, desc) {
var current = Object.getOwnPropertyDescriptor(object, key),
extensible = Object.isExtensible(object);

if (!current) {
if (!extensible) {
return false;
}

Object.defineProperty(object, key, desc);

return true;
}

var desc_fields = Object.getOwnPropertyNames(desc);

if (desc_fields.every(function (key) { return ES.SameValue(desc[key], current[key]); })) {
return true;
}

if (!current.configurable) {
if (desc.configurable || typeof desc.enumerable === 'boolean' &&
desc.enumerable !== current.enumerable) {
return false;
}
}

if (!isDataDescriptor(desc) && !isAccessorDescriptor(desc)) {
// isGenericDescriptor.
// No further validation required.
} else if (isDataDescriptor(desc) && isDataDescriptor(current)) {
if (!current.configurable && !current.writable &&
desc.writable || !ES.SameValue(desc.value, current.value)) {
return false;
}
} else if (isAccessorDescriptor(desc) && isAccessorDescriptor(current)) {
if (!current.configurable &&
(desc.set && desc.set !== current.set) ||
(desc.get && desc.get !== current.get)) {
return false;
}
} else if (!current.configurable) {
return false;
}

Object.defineProperty(object, key, desc);
return true;
};

var internal_get = function get(target, key, receiver) {
var desc = Object.getOwnPropertyDescriptor(target, key);

Expand Down Expand Up @@ -2349,9 +2292,7 @@
return ES.Construct(constructor, args);
},

defineProperty: throwUnlessTargetIsObject(__defineOwnProperty),
// alternatively:
// defineProperty: wrapObjectFunction(Object.defineProperty),
defineProperty: wrapObjectFunction(Object.defineProperty),

// When deleting a non-existant or configurable property,
// true is returned.
Expand Down
24 changes: 0 additions & 24 deletions test/reflect.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,23 +73,6 @@ describe('Reflect', function () {
});

describe('Reflect.defineProperty()', function () {
// Compare our implementation with the below.
// Being much simpler, it would be preferable
// if the behaviour is equivalent.
var Object_defineProperty = function (o, k, d) {
try {
Object.defineProperty(o, k, d);
return true;
} catch (_) {
return false;
}
};

var expectDefine = function (args, res) {
expect(Reflect.defineProperty.apply(Reflect, args)).to.equal(res);
expect(Object_defineProperty.apply(null, args)).to.equal(res);
};

it('is a function', function () {
expect(typeof Reflect.defineProperty).to.equal('function');
});
Expand All @@ -104,7 +87,6 @@ describe('Reflect', function () {
var o = Object.preventExtensions({});

expect(Reflect.defineProperty(o, 'prop', {})).to.equal(false);
expect(Object_defineProperty(o, 'prop', {})).to.equal(false);
});

it('can return true, even for non-configurable, non-writable properties', function () {
Expand All @@ -116,16 +98,13 @@ describe('Reflect', function () {
};

expect(Reflect.defineProperty(o, 'prop', desc)).to.equal(true);
expect(Object_defineProperty(o, 'prop', desc)).to.equal(true);

// Defined as non-configurable, but descriptor is identical.
expect(Reflect.defineProperty(o, 'prop', desc)).to.equal(true);
expect(Object_defineProperty(o, 'prop', desc)).to.equal(true);

desc.value = 37; // Change

expect(Reflect.defineProperty(o, 'prop', desc)).to.equal(false);
expect(Object_defineProperty(o, 'prop', desc)).to.equal(false);
});

it('can change from one property type to another, if configurable', function () {
Expand All @@ -146,13 +125,10 @@ describe('Reflect', function () {
};

expect(Reflect.defineProperty(o, 'prop', desc1)).to.equal(true);
expect(Object_defineProperty(o, 'prop', desc1)).to.equal(true);

expect(Reflect.defineProperty(o, 'prop', desc2)).to.equal(true);
expect(Object_defineProperty(o, 'prop', desc2)).to.equal(true);

expect(Reflect.defineProperty(o, 'prop', desc3)).to.equal(false);
expect(Object_defineProperty(o, 'prop', desc3)).to.equal(false);
});
});

Expand Down

0 comments on commit da3d2a6

Please sign in to comment.