# inheritedPropertyDescriptors > Return an object's inherited [property descriptors][@stdlib/utils/property-descriptors].
## Usage ```javascript var inheritedPropertyDescriptors = require( '@stdlib/utils/inherited-property-descriptors' ); ``` #### inheritedPropertyDescriptors( obj\[, level] ) Returns an object's inherited [property descriptors][@stdlib/utils/property-descriptors]. ```javascript function Foo() { this.a = 'b'; return this; } Foo.prototype.beep = 'boop'; var f = new Foo(); var desc = inheritedPropertyDescriptors( f ); // returns { 'beep': {...}, ... } ``` By default, the function walks an object's entire prototype chain. To limit the inheritance level, provide a `level` argument. ```javascript var inherit = require( '@stdlib/utils/inherit' ); function Bar() { return this; } Bar.prototype.boop = 'beep'; function Foo() { Bar.call( this ); this.a = 'b'; return this; } inherit( Foo, Bar ); Foo.prototype.beep = 'boop'; var f = new Foo(); var desc = inheritedPropertyDescriptors( f, 1 ); // returns { 'beep': {...}, ... } ```
## Notes - In contrast to the built-in `Object.getOwnPropertyDescriptors()`, if provided `null` or `undefined`, the function returns an empty `object`, rather than throwing an error.
## Examples ```javascript var defineProperty = require( '@stdlib/utils/define-property' ); var inheritedPropertyDescriptors = require( '@stdlib/utils/inherited-property-descriptors' ); function Foo() { this.beep = 'boop'; this.a = { 'b': 'c' }; defineProperty( this, 'baz', { 'value': 'qux', 'configurable': true, 'writable': true, 'enumerable': false }); return this; } Foo.prototype.foo = [ 'bar' ]; var obj = new Foo(); var desc = inheritedPropertyDescriptors( obj ); console.log( desc ); // => { 'foo': {...}, ... } ```