- 创建对象的四种方式
- 字面量创建
let o1 = { name:'rose' age:20 gender:'女' }- 内置构造函数创建
let o1 = new Object() o1.name = 'rose' o1.age = 20- 工厂函数创建对象:先自己做一个工厂函数,使用自己做的工厂函数来创建对象
function createObj(name,age,gender){//创建一个工厂函数 let obj = {}//手动创建一个对象 //手动添加成员 obj.name = name obj.age = age 0bj.gender = gender return obj//手动返回这个对象 }- 自定义构造函数创建
function createObj(){ //自己书写一个构造函数 function createObj(name,age,gender){} //自动创建一个对象 //手动向对象上添加内容 this.name = name this.age = age this.gender = gender //自动返回这个对象 let o1 = neww createObj('jack',18,'女') } - 构造函数的书写和使用
- 构造函数也是函数,只不过在调用的时候和new 关键字连用了
- 调用必须有new 关键字,如果没有,那么没有创建对象的能力。只要有,就会自动创建一个对象
- 在构造函数内部不要写return,如果return 基本数据类型,写了白写,如果return复杂数据类型,构造函数白写
- 构造函数在调用的时候,如果不需要传递参数,最后的小括号可以不写,但是推荐都写上
- 构造函数推荐首字母大写是为了直接观看与普通函数的区别,看到首字母大写的函数,基本上就要和new连用
- 当函数和new连用会创建对象,我们管创造出来的对象叫做实例对象,创造函数的过程叫做实例化过程,构造函数体内的this指向当前实例对象,也就是本次new的时候创建的那个对象
- prototype(原型/原型对象)
- 每一个函数天生自带一个属性叫做prototype,他是一个对象,只要函数定义好以后,这个prototype就有了,构造函数也是函数,构造函数也有prototype,可以向里面添加一些内容
- prototype 里面有一个属性叫做constructor,表示是那个构造函数半生的属性
- prototype作用就是为了书写一些方法给该构造函数的实例对象使用,因为这个构造函数的每一个构造函数都可以访问
- ———proto—— 每一个对象天生自带一个属性,叫做——proto——,指向所属构造函数的prototype
- 实例化对象也是一个对象,实例化对象也有——proto——属性
- 对象访问机制
- 当访问一个对象成员的时候,如果对象本身有,直接返回结果给你,停止查询,如果对象自己本身没有,会自动去——proto——上访问,有就给你返回结果,停止查询,如果还没有继续向上查询
- 原型链
- 从任何一个对象出发,按照——proto——串联起来的对象链状结构,为了对象访问机制而存在
数组.__proto__ === Array.prototype Array.prototype._proto_ === Objeck.prototype 数组._proto_._proto_ === Objeck.prototype - 判断数据类型
- 1.typeof : 准确的判断基本数据类型,对于复杂数据类型不准确(对象,数组,函数)
- 2.constructor : 利用原型的属性,利用对象访问机制,不能验证undefind和null
-
- instanceof : 语法: 对象 instanceof 构造函数 不能验证基本数据类型
- 4.Objeck.porototype.tostring.call(要检测的数据类型)
- 数据劫持
-
- hasOwnProperty
- 查看是不是自己的属性 语法 : 对象.hasOwnProperty('你要检测的属性名')
-
- defineProperty() 数据劫持
- 一种给对象添加属性的方法,可以给一个设置好的属性设置各种各样的属性
- 语法: Objeck.definProperty(给哪一个对象添加,{添加的设置})
-