[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' ]
~~~
- Javascript基础篇
- Array数组
- 数组插入值
- filter()
- forEach()
- push()
- pop()
- unshift()
- shift()
- valueOf()
- 面向对象思想
- Javascript 面向对象编程(一):封装
- Javascript面向对象编程(二):构造函数的继承
- Javascript面向对象编程(三):非构造函数的继承
- 解构
- 数组的解构赋值
- 对象的解构赋值
- 函数参数解构
- 字符串的解构赋值
- 数值和布尔值的解构赋值
- 圆括号问题
- 字符串.
- split()
- charAt()
- charCodeAt()
- concat()
- indexOf()
- lastIndexOf()
- match()
- replace()
- includes()
- 初识递归
- 渲染ul-li树形结构
- 异步函数解决方案
- 1. callback回调函数
- 2. ES6 - Promise
- JavaScript高级程序设计(书)
- 在html中使用JavaScript
- script标签的位置
- 延迟脚本
- 异步脚本
- <noscript>元素
- 基本概念
- 严格模式
- 变量详解
- 数据类型
- typeof操作符
- undefined类型
- Null类型
- Boolean类型
- Number类型
- 深入了解ES6(书)
- var 、let 、 const
- 字符串与正则表达式
- 字符串
- 正则表达式
- 函数
- 函数形参默认值
- 使用不具名参数
- 函数构造器的增强能力
- 扩展运算符
- name属性
- 明确函数的多重用途
- 块级函数
- 箭头函数
- 尾调用优化
- 扩展的对象功能
- 对象类别
- 对象字面量语法的扩展
- ES6对象新增方法
- 重复的对象属性
- 自有属性的枚举顺序
- 更强大的原型
- 解构:更方便的数据访问
- 为什么要用解构?
- 对象解构
- 数组解构
- 混合解构
- 参数解构
- Symbol与Symbol属性
- 创建Symbol
- Symbol的使用方法
- Symbol全局私有属性
- Symbol与类型强制转换
- Symbol属性检索
- Symbol的一些构造方法
- Set集合与Map集合
- Set集合
- Weak Set集合(弱引用Set集合)
- Map集合
- JS标准内置对象
- Object 构造函数及属性
- Object 构造方法
- Symbol 内建对象类的函数及属性
- Set 构造函数及属性
- Weak Set 构造函数及属性
- JS杂项
- 类数组对象
- Class类的理解和使用