为什么要用 高内聚低耦合,少占用内存空间(降低代码得耦合度,从而使代码能够较高得复用性,方便移植)
面向对象三个特点:
1.多态
2.封装
3.继承
首先创建对象方法:
字面量创建
let objec = {};
js内置构造函数 new关键字c
let objct = new Objct();
工厂函数创建
function createObj(){//工厂函数
let obj = {}
obj.name = "小白"
retrun obj
}
let o1 = createObj();
构造函数
function ceateObj(name){//构造函数 普通函数
let o1 = {
name :name
}
retrun o1;
}
let obj = new ceateObj()
构造函数的目的 :为了创建一个有属性有方法合理的对象,造函数也是函数只不过在调用时跟new关键字连用了
1.函数调用时 一定要用new
2.不要 3.构造函数创建的对象叫做实例对象,创建过程叫做实例话过程
4.造函数推荐首字母大写,跟普通的函数做区别
注:
简单数据类型 Number,String,Null,Undefined,Boolean
复杂数据类型 Fnction,Object,Array 还有new Date之类的通过 new创建的对象
*this指向本次创建的实例对象
构造函数使用的合理性
上面的代码内次实例化这个构造函数都要生成一哥对应的发方法存储在内存中是不合理的
原型 prototype
作用:书写一些方法给他的实例化对象使用的
定义:每一个函数天生自带一个原型,是一个对象,构造函数也有prototype, 打印出来,有一个原生的constructor('表示是哪个构造函数伴生的原型对象')
proto 定义:每一个对象天生自带一个_proto_属性,这个属性指向他所属的构造函数的prototype,实例化对象也是一个对象,也有_proto_属性
每一个被实例化出来的对象,带的_proto_指他的构造函数的prototype
- 关系: 实例化对象.proto ====> 实例化对象的构造函数 ====> 实例化对象的构造函数的原型(prototype)、
let Persion = function(){}
Persion.prototype.name = function(){}
let u = new Persion();
console.log(Persion.prototype === u.__proto__)// true 访问的是内存中的同一个地址
构造函数的this指向 =======================
构造函数体内的this因为用了new关键字所以指向自己
构造函数原型(prototype)上的函数,也是指向当前实例
箭头函数没有this指向,它里面的this指向声明加案头函数时候的作用域,他外面最近一层的作用域
对象的访问机制
先在自己身上找, 没有在找上一层,用(proto) ,一直向上, 一直找到顶级,没有返回undefined
当一个对象没有准确的构造函数来实例化的时候我们都看作是内置构造函数object的实例
var arr = []// Array;内置
var obj = {}// object内置
var date = new Date();// date的实例