es6.reflect.set.js 1.2 KB

12345678910111213141516171819202122232425262728293031
  1. // 26.1.13 Reflect.set(target, propertyKey, V [, receiver])
  2. var dP = require('./_object-dp')
  3. , gOPD = require('./_object-gopd')
  4. , getPrototypeOf = require('./_object-gpo')
  5. , has = require('./_has')
  6. , $export = require('./_export')
  7. , createDesc = require('./_property-desc')
  8. , anObject = require('./_an-object')
  9. , isObject = require('./_is-object');
  10. function set(target, propertyKey, V/*, receiver*/){
  11. var receiver = arguments.length < 4 ? target : arguments[3]
  12. , ownDesc = gOPD.f(anObject(target), propertyKey)
  13. , existingDescriptor, proto;
  14. if(!ownDesc){
  15. if(isObject(proto = getPrototypeOf(target))){
  16. return set(proto, propertyKey, V, receiver);
  17. }
  18. ownDesc = createDesc(0);
  19. }
  20. if(has(ownDesc, 'value')){
  21. if(ownDesc.writable === false || !isObject(receiver))return false;
  22. existingDescriptor = gOPD.f(receiver, propertyKey) || createDesc(0);
  23. existingDescriptor.value = V;
  24. dP.f(receiver, propertyKey, existingDescriptor);
  25. return true;
  26. }
  27. return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);
  28. }
  29. $export($export.S, 'Reflect', {set: set});