UNPKG

es-abstract

Version:

ECMAScript spec abstract operations.

39 lines (29 loc) 1.25 kB
'use strict'; var $TypeError = require('es-errors/type'); var gOPD = require('gopd'); var isObject = require('../helpers/isObject'); var isPropertyKey = require('../helpers/isPropertyKey'); var CreateDataPropertyOrThrow = require('./CreateDataPropertyOrThrow'); var SameValue = require('./SameValue'); var Set = require('./Set'); // https://262.ecma-international.org/16.0/#sec-SetterThatIgnoresPrototypeProperties module.exports = function SetterThatIgnoresPrototypeProperties(thisValue, home, p, v) { if (!isObject(home)) { throw new $TypeError('Assertion failed: `home` must be an object'); } if (!isPropertyKey(p)) { throw new $TypeError('Assertion failed: `p` must be a Property Key'); } if (!isObject(thisValue)) { // step 1 throw new $TypeError('Assertion failed: `thisValue` must be an Object'); // step 1.a } if (SameValue(thisValue, home)) { // step 2 throw new $TypeError('Throwing here emulates assignment to a non-writable data property on the `home` object in strict mode code'); // step 2.b } var desc = gOPD(thisValue, p); // step 3 if (typeof desc === 'undefined') { // step 4 CreateDataPropertyOrThrow(thisValue, p, v); // step 4.a } else { // step 5 Set(thisValue, p, v, true); // step 5.a } };