保持对代码的热爱并保持怀疑态度
首先得知道一点:在js中万物皆对象 Everything is object
面向对象编程:就是以对象为主的编程
对象 -就是数据的打包
- 数据的查找速度得到提升
- 数据的传输速度得到提升
面向对象的三大设计思想
·面向对象分析(OOA):不断的将无法直接解决的大问题,拆分成可以直接解决的小问题
·面向对象设计(OOD):每个系统之间,需要有数据关联,但又没有功能依赖
·面向对象编程(OOP):
封装(忽略细节选择使用重复使用)
继承(相当于你有个父元素,然后子元素可以直接用父元素的值)
多态(多种形态的使用)
实例
//自定义构造函数的的名字的首字母就要大写,大驼峰的命名方式 例如 function Fn(){}
function Game(){
return {name:"你"};
}
var f=new Game(); //new执行 如果没有传参()可以省略
console.log(f);
new的原理:
- 创建了一个新对象
- 将函数内部的this,指向了这个新对象
- 将这个新对象的__proto__,指向改函数的prototype
- 原函数没有主动返回对象,那么返回new创建的对象
什么是原型和原型链
首先我们先来看一段代码
function fn(n,c){
this.id = n;
this.student = c;
this.info = function(){
console.log(`信息${this.id}的${this.student}`);
}
}
var f1 = new fn("1","你的名字"); //关键字new创建对象
console.log(f1);
f1.skill() //调用函数中的方法
内置工厂模式(自定义构造函数)的不足
- 多个实例的拥有多个相同方法,造成内存的冗余
- 借助原型,解决方法冗余问题
prototype
:原型对象(也叫显示原型),专属于函数,用来给将来new出来的实例,做公共空间使用__proto__
:原型链对象(隐式原型),每个对象都具有这个属性,他表示一个指向,用来指向自身的公共空间(new出自身的函数的prototype)- 对象的属性的读写规则:如:obj.name
- 读:先在自身查找,找到了,使用,没找到,顺着__proto__向上层查找,找到了就使用,并停止查找,没找到,继续顺着__proto__查找,直到顶层,没有找到,抛出undefined
- 写:先在自身查找,找到了,就赋值,没找到,就设置一个属性
最终语法
function Fn(n,c){
this.id = n;
this.student = c;
this.skill(); //执行方法调用了绑定在原型身上的skill方法
}
// 类,接口 //公共的
Fn.prototype.skill = function(){
console.log(`来自于${this.id}的${this.student}`);
this.info(); //执行方法info
}
Fn.prototype.info = function(){
console.log(`信息${this.id}的${this.student}`);
}
new Fn("1","你的名字");
也就是说函数中的可以拿到prototype并且直接执行如show()
反之prototype里面也可以拿函数中的值,如this.name
es6 新增的 class
class原理也就是封装了原型。
语法
class Fn{ //命名
constructor(){
this.sex(); //方法执行
}
sex(){ //方法中具体的语句
console.log("随啦啦啦");
}
}
**千万千万别忘了new执行,我就是老忘记**
new Fn();