ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] >[success] # Object 构造方法 <br/> >[success] ## Object.create() ~~~ 'Object.create'是'创建对象'的一个方法,可以创建一个'继承其他对象原型链方法'的对象: 语法: Object.create(proto, [propertiesObject]) 参数: 1. 'proto':必传。表示新建对象的'原型对象',该参数会被赋值到新对象的'原型'上。 该'参数可以是null,对象,函数的prototype属性'创建空对象(无'原型链__proto__属性'的对象)时需传'null' ,否则会抛出TypeError异常。 2. 'propertiesObject' : 可选。 '添加'到'新创建对象的可枚举属性'(即其'自身的属性',而不是原型 链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应`Object.defineProperties()` 的第二个参数。 ~~~ 1. 创建空对象(无原型链__proto__属性的对象): ~~~ let obj1 = Object.create(null) let obj2 = {} console.log(obj1) // {} 无任何原型链属性 console.log(obj2) // {} 附带 __proto__属性 ~~~ 2. 实现类式继承(单继承 ) ~~~ // 父类构造函数 function Parent (name, age) { this.name = name; this.age = age; } // 父类的原型链方法 Parent.prototype.hehe = function () { console.log(this.name) console.log(this.age) } // 子类构造函数 function Child () { } // 子类继承父类原型链属性和方法 Child.prototype = Object.create(Parent.prototype) Child.prototype.constructor = Child // 实例化子类对象 let childFun = new Child() // 给父类属性赋值后执行父类方法 childFun.name = '爸爸的名字' childFun.age = '1000' childFun.hehe() ~~~ 3. 参数为对象时 ~~~ let obj1 = { name: '鸣子嘎', test() { console.log(this.name) } } let obj2 = Object.create(obj1) console.log(obj2.name) // 鸣子嘎 // 下面的obj3属性name优先级高于obj1(原型)中的name属性 let obj3 = Object.create(obj1, { name: { value: '毅子嘎' } }) console.log(obj3.name) // 毅子嘎 ~~~ 4. 混入继承 ~~~ // 父亲构造函数 function Father (name) { this.name = name } Father.prototype.test = function () { console.log(this.name, '父亲') } // 母亲构造函数 function Mother (name) { this.name = name } Mother.prototype.test = function () { console.log(this.name, '母亲') } // 儿子构造函数 function Child () { } // 继承一个类 Child.prototype = Object.create(Father.prototype) // 混合其它(多个原型时,并且原型的属性或方法同名,后面原型会覆盖前面原型中的属性或方法) Object.assign(Mother.prototype, Father.prototype) // 重新指定constructor Child.prototype.constructor = Child; // 实例化儿子对象 let childFun = new Child() childFun.name = '打印出的是' childFun.test() // 打印出的是 父亲 ~~~ <br/> >[success] ## Object.defineProperties() ~~~ 'Object.defineProperties()'方法直接在一个对象上定义'新的属性'或'修改现有属性',并返回该对象。 语法: Object.defineProperties(obj, prop) 参数: 1. 'obj':在其上定义或修改属性的'对象'。 2. 'prop' : 要定义其可枚举属性或修改的属性描述符的对象。对象中存在的属性描述符主要有两种: '数据描述符'和'访问器描述符'。'描述符属性'看下面'表格' ~~~ <br/> 1. 参数 | 数据描述符 | 访问器描述符 | 作用 | 默认值 | | --- | --- | --- | --- | | configurable | | 是否可编辑、是否可删除 | false | | enumerable | | 是否可枚举 | false | | value | | 对象的value值 | undefined | | writable | | 是否可编辑 | false | | | get | 作为该属性的 getter 函数,如果没有 getter 则为undefined。函数返回值将被用作属性的值。 | undefined | | | set | 作为属性的 setter 函数,如果没有 setter 则为undefined。函数将仅接受参数赋值给该属性的新值。 | undefined | 2. 使用方法 ~~~ var obj = {}; Object.defineProperties(obj, { 'name': { value: '小明', writable: true, enumerable: true, configurable: true }, 'age': { value: '18', writable: false, enumerable: false, configurable: true } }); console.log(obj) // { name: '小明' } ~~~ <br/> >[success] ## Object.getOwnPropertyDescriptor() ~~~ 'Object.getOwnPropertyDescriptor()'方法返回'指定对象'上一个'自有属性'对应的'属性描述符'。(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性) 语法: Object.getOwnPropertyDescriptor(obj, prop) 参数: 1. 'obj':需要查找的目标对象 2. 'prop' : 目标对象内属性名称 ~~~ 1. 简单例子 ~~~ let obj = { haha: '奥利给' } console.log(Object.getOwnPropertyDescriptor(obj, "haha")) /** * { value: '奥利给', * writable: true, * enumerable: true, * configurable: true } */ ~~~ <br/> >[success] ## Object.getPrototypeOf() ~~~ 'Object.getPrototypeOf()'方法返回'指定对象'的'原型'(内部[[Prototype]]属性的值) 语法: Object.getPrototypeOf(object) 参数: 1. 'object':要返回其原型的对象。 返回值: 给定对象的原型。如果没有继承属性,则返回 null 。 ~~~ 1. 简单例子 ~~~ const prototype1 = {} const object1 = Object.create(prototype1) console.log(Object.getPrototypeOf(object1) === prototype1) // true ~~~ <br/> >[success] ## Object.keys() ~~~ 'Object.keys()'方法会返回一个由一个'给定对象的自身可枚举属性组成的数组',数组中属性名的排列顺序 和使用 'for...in' 循环遍历该对象时返回的顺序一致 。 语法: Object.keys(obj) 参数: 1. 'obj':要返回其枚举自身属性的对象。 ~~~ 1. 简单例子 ~~~ // 数组 let arr = ['哈哈', '呵呵', '嘎嘎'] console.log(Object.keys(arr)) // [ '0', '1', '2' ] // 相当和下面这么写一样 // 对象 let arr2 = { '0': '哈哈', '1': '呵呵', '2': '嘎嘎' } console.log(Object.keys(arr2)) // [ '0', '1', '2' ] ~~~ <br/> >[success] ## Object.getOwnPropertyNames() ~~~ 'Object.getOwnPropertyNames()'方法返回一个'对象所有属性名'(包括'不可枚举属性'但不包括 'Symbol值作为名称的属性')组成的'数组'。 语法: Object.getOwnPropertyNames(obj) 参数: 1. 'obj':一个对象,其自身的可枚举和不可枚举属性的名称被返回。返回值 ~~~ 1. 简单例子 ~~~ let obj = Object.create({},{ 'name': { configurable: true, // 可编辑、删除 enumerable: false, // 不可枚举 value: '呵呵哒', // 值 writable: true // 可编辑 }}) obj.aaa = '123' console.log(obj) // { aaa: '123' } console.log(Object.keys(obj)) // 返回 [ 'aaa' ] console.log(Object.getOwnPropertyNames(obj)) // 返回 [ 'name', 'aaa' ] ~~~