doc: add section regarding property definition in `primordials.md`

PR-URL: https://github.com/nodejs/node/pull/42921
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Akhil Marsonya <akhil.marsonya27@gmail.com>
pull/42952/head
Antoine du Hamel 2022-05-02 19:46:13 +02:00 committed by GitHub
parent 75dbb86c58
commit 52ba02e874
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 56 additions and 0 deletions

View File

@ -594,3 +594,59 @@ ObjectDefineProperties(regex, {
});
console.log(RegExpPrototypeSymbolReplace(regex, 'foo', 'a')); // 'faa'
```
### Defining object own properties
When defining property descriptor (to add or update an own property to a
JavaScript object), be sure to always use a null-prototype object to avoid
prototype pollution.
```js
// User-land
Object.prototype.get = function get() {};
// Core
try {
ObjectDefineProperty({}, 'someProperty', { value: 0 });
} catch (err) {
console.log(err); // TypeError: Invalid property descriptor.
}
```
```js
// User-land
Object.prototype.get = function get() {};
// Core
ObjectDefineProperty({}, 'someProperty', { __proto__: null, value: 0 });
console.log('no errors'); // no errors.
```
Same applies when trying to modify an existing property, e.g. trying to make a
read-only property enumerable:
```js
// User-land
Object.prototype.value = 'Unrelated user-provided data';
// Core
class SomeClass {
get readOnlyProperty() { return 'genuine data'; }
}
ObjectDefineProperty(SomeClass.prototype, 'readOnlyProperty', { enumerable: true });
console.log(new SomeClass().readOnlyProperty); // Unrelated user-provided data
```
```js
// User-land
Object.prototype.value = 'Unrelated user-provided data';
// Core
const kEnumerableProperty = { __proto__: null, enumerable: true };
// In core, use const {kEnumerableProperty} = require('internal/util');
class SomeClass {
get readOnlyProperty() { return 'genuine data'; }
}
ObjectDefineProperty(SomeClass.prototype, 'readOnlyProperty', kEnumerableProperty);
console.log(new SomeClass().readOnlyProperty); // genuine data
```