面向对象
-
面向对象 : 思维方式 ,编程方式
- 面向过程 : 注重事物发展的过程 ,一步一步执行
- 面向对象 :分析事物中的对象 ,分析 属性和方法 ---》抽离成类 (复用性)---》研究类之间的逻辑关系
-
js里的对象
-
如何创建对象
- 字面量
- 内置构造函数
-
-
模拟类概念
- 工厂模式 :类的概念 ,工厂可以生产很多个对象
function Factory(){ let obj = {}; obj.name = name; return obj; }
-
工厂模式有缺陷
- 指代不明
- 没有 公共空间 ,性能不好
-
构造函数
-
new 的作用
- 可以执行函数
- 创建一个对象
- 把函数里的this绑在这个对象上
- 隐式的返还这个对象
-
通过new 来简化工厂模式
function Person(name,age){ this.name = name; this.age = age; } var zhangsan = new Person();
-
构造函数 模拟类的概念
-
指代问题
zhangsan.constructor===Person
;
-
公共空间
- 原型 prototype 是一个公共空间
- 一般在构造函数里 会把属性放在构造函数 把方法放在原型上
function Person(){ this.name = name; } Person.prototype.fn = function(){ console.log("fn"); } // Person.prototype.age = 20; let zhangsan = new Person();
-
-
prototype 原型
- 每个对象都会有自身和原型构成
-
实例化前 ---> 构造函数 和prototype (显示原型)
- 有一个固有属性 constructor 指回构造函数 (判断类型)
- prototype 的赋值问题
- 追加赋值
var obj = { name:"李四" } var obj = { // 覆盖式的赋值 height:"178" } obj.height = "178cm"; // 追加 在原来的对象上追加属性
-
实例化后 -->对象
- 对象的属性 和 对象的原型 ([[prototype]],proto); 隐式原型
obj.__proto__===构造函数.prototype // true
- getPrototypeOf :获取对象的隐式原型
- setPrototypeOf :设置对象的隐式原型
- 对象的属性 和 对象的原型 ([[prototype]],proto); 隐式原型
-
创建原型属性和方法 : Object.create({});
-
原型是一个对象
-
原型链 : 由于 原型本身是一个对象 Object.prototype
- 对象的属性和方法的查找规则
- 首先会在自身查找 然后再在原型上查找 原型链上查找 ,最终会找到undefined
- 对象的属性和方法的查找规则
-
for in 会循环原型链
- hasOwnPrototype : 判断一个属性是否是自身属性
-
constructor :判断类型
-
instanceof : 查找对象在原型链上是否有构造关系
-
扩充复杂数据类型方法
Array.prototype.fn = function(){ // 所有的数组 都会拥有这个fn方法 console.log(this);// 哪个数组调用了 fn函数 } var arr = [1,2,3];
-
ES6的类
- 怎么写 ? class
class Person{
constructor(name){
this.name = name;
}
fn(){
console.log("fn")
}
}
let zhangsan = new Person("张三");
-
静态成员 :只和类有关系 和对象没有关系的属性和方法
- static 声明
//ES6 静态成员 class Person{ static num = 10; } Person.num; // ES5 构造函数 function Person(){ } Person.num = 10; // 定义静态成员
-
私有属性 自身可以调用 外部(实例化之后)不能调用
- '#'
class Person{ #name = "张三"; } // 共有方法调取私有属性