1234567891011121314151617181920212223242526272829303132333435363738394041 |
- 'use strict';
- var $TypeError = require('es-errors/type');
- var DefinePropertyOrThrow = require('./DefinePropertyOrThrow');
- var IsExtensible = require('./IsExtensible');
- var IsPropertyKey = require('./IsPropertyKey');
- var Type = require('./Type');
- // https://262.ecma-international.org/13.0/#sec-definemethodproperty
- module.exports = function DefineMethodProperty(homeObject, key, closure, enumerable) {
- if (Type(homeObject) !== 'Object') {
- throw new $TypeError('Assertion failed: `homeObject` is not an Object');
- }
- if (!IsPropertyKey(key)) {
- throw new $TypeError('Assertion failed: `key` is not a Property Key or a Private Name');
- }
- if (typeof closure !== 'function') {
- throw new $TypeError('Assertion failed: `closure` is not a function');
- }
- if (typeof enumerable !== 'boolean') {
- throw new $TypeError('Assertion failed: `enumerable` is not a Boolean');
- }
- // 1. Assert: homeObject is an ordinary, extensible object with no non-configurable properties.
- if (!IsExtensible(homeObject)) {
- throw new $TypeError('Assertion failed: `homeObject` is not an ordinary, extensible object, with no non-configurable properties');
- }
- // 2. If key is a Private Name, then
- // a. Return PrivateElement { [[Key]]: key, [[Kind]]: method, [[Value]]: closure }.
- // 3. Else,
- var desc = { // step 3.a
- '[[Value]]': closure,
- '[[Writable]]': true,
- '[[Enumerable]]': enumerable,
- '[[Configurable]]': true
- };
- DefinePropertyOrThrow(homeObject, key, desc); // step 3.b
- };
|