🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # Object.getPrototypeOf(obj) 返回指定对象的原型(内部[[Prototype]]属性的值) ``` var proto = {}; var obj = Object.create(proto); Object.getPrototypeOf(obj) === proto; // true var reg = /a/; Object.getPrototypeOf(reg) === RegExp.prototype; // true ``` <br> # Object.getOwnPropertyDescriptor(obj, prop) 返回指定对象上一个自有属性对应的属性描述符。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性) <br> 参数 * obj:需要查找的目标对象 * prop:目标对象内属性名称 返回值 * 如果指定的属性存在于对象上,则返回其属性描述符对象(property descriptor),否则返回 undefined ``` var o, d; o = { get foo() { return 17; } }; d = Object.getOwnPropertyDescriptor(o, "foo"); // d { // configurable: true, // enumerable: true, // get: /*the getter function*/, // set: undefined // } ``` <br> <br> # Object.getOwnPropertyNames(obj) 返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。 <br> 参数 * obj一个对象,其自身的可枚举和不可枚举属性的名称被返回。 返回值 * 在给定对象上找到的自身属性对应的字符串数组。 <br> ``` var arr = ["a", "b", "c"]; console.log(Object.getOwnPropertyNames(arr).sort()); // ["0", "1", "2", "length"] // 类数组对象 var obj = { 0: "a", 1: "b", 2: "c"}; console.log(Object.getOwnPropertyNames(obj).sort()); // ["0", "1", "2"] ``` <br> <br> # Object.create(proto, [propertiesObject]) 创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。 <br> 参数 * proto:新创建对象的原型对象。 * propertiesObject:可选。如果没有指定为 undefined,则是要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。 ``` const person = { isHuman: false, printIntroduction: function () { console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`); } }; const me = Object.create(person); me.name = "Matthew"; // "name" is a property set on "me", but not on "person" me.isHuman = true; // inherited properties can be overwritten me.printIntroduction(); // expected output: "My name is Matthew. Am I human? true" ``` <br> <br> # Object.defineProperty(obj, prop, descriptor) 直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。 <br> 参数 * obj:要在其上定义属性的对象。 * prop:要定义或修改的属性的名称。 * descriptor:将被定义或修改的属性描述符。 <br> <br> # Object.defineProperties(obj, props) 直接在一个对象上定义新的属性或修改现有属性,并返回该对象。 <br> 参数 * obj:在其上定义或修改属性的对象。 * props:要定义其可枚举属性或修改的属性描述符的对象。对象中存在的属性描述符主要有两种:数据描述符和访问器描述符(更多详情,请参阅Object.defineProperty())。描述符具有以下键: * configurable:当且仅当该属性描述符的类型可以被改变并且该属性可以从对应对象中删除。默认为 false * enumerable:当且仅当在枚举相应对象上的属性时该属性显现。默认为 false * value:与属性关联的值。可以是任何有效的JavaScript值(数字,对象,函数等)。默认为 undefined. * writable:当且仅当与该属性相关联的值可以用assignment operator改变时。默认为 false * get:作为该属性的 getter 函数,如果没有 getter 则为undefined。函数返回值将被用作属性的值。默认为 undefined * set:作为属性的 setter 函数,如果没有 setter 则为undefined。函数将仅接受参数赋值给该属性的新值。默认为 undefined <br> ``` var obj = {}; Object.defineProperties(obj, { 'property1': { value: true, writable: true }, 'property2': { value: 'Hello', writable: false } // etc. etc. }); ``` <br> <br> # Object.seal(obj) 封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置。当前属性的值只要可写就可以改变。 ``` const object1 = { property1: 42 }; Object.seal(object1); object1.property1 = 33; console.log(object1.property1); // expected output: 33 delete object1.property1; // cannot delete when sealed console.log(object1.property1); // expected output: 33 ``` <br> <br> # Object.freeze(obj) 可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。 ``` const object1 = { property1: 42 }; const object2 = Object.freeze(object1); object2.property1 = 33; // Throws an error in strict mode console.log(object2.property1); // expected output: 42 ``` # Object.preventExtensions(obj) 让一个对象变的不可扩展,也就是永远不能再添加新的属性。 <br> <br> # Object.isSealed(obj) 判断一个对象是否被密封 <br> <br> # Object.isFrozen(obj) 判断一个对象是否被冻结 <br> <br> # Object.isExtensible(obj) 判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。 <br> <br> # Object.keys(obj) 返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用 for...in 循环遍历该对象时返回的顺序一致 。 ``` // simple array var arr = ['a', 'b', 'c']; console.log(Object.keys(arr)); // console: ['0', '1', '2'] // array like object var obj = { 0: 'a', 1: 'b', 2: 'c' }; console.log(Object.keys(obj)); // console: ['0', '1', '2'] var anObj = { 100: 'a', 2: 'b', 7: 'c' }; console.log(Object.keys(anObj)); // console: ['2', '7', '100'] ```