# 一、JSON
## 真正的json
1. json数据,可以放在json文件中,也可以出现在编程语言中
- 是一种文本数据,有专门的文件存储,.json文件
- 类似于:记事本文件:.txt
- 有固定的语法要求
## 真正的json
1. json数据,可以放在json文件中,也可以出现在编程语言中
- 是一种文本数据,有专门的文件存储,.json文件
- 类似于:记事本文件:.txt
- 有固定的语法要求
2. json是用来做什么的:通用数据
- 是一种文本数据,用来作为服务器端和客户端数据交互时,存储数据
- 是一种编程语言中的通用数据,任何一门编程语言,都能识别,都能解析,都认识
- 是一种文本数据,用来作为服务器端和客户端数据交互时,存储数据
- 是一种编程语言中的通用数据,任何一门编程语言,都能识别,都能解析,都认识
## 编程语言中的json
1. js中的json,类似于数组和对象,只不过还需要遵守json的要求,js中有提供json和数组对象的转换方法
- 日常在js中,所谓的json数组,json对象,其实只是参考了json数据的名字,别名,起了个名字
- 自身其实就是编程语言中的数组或对象
2. php中的json,字符,只不过可以将php的数组和对象,通过一些方法转成json的格式
3. 任何一门编程语言中,都提供有将自身的某些数据,转成json的方法
1. js中的json,类似于数组和对象,只不过还需要遵守json的要求,js中有提供json和数组对象的转换方法
- 日常在js中,所谓的json数组,json对象,其实只是参考了json数据的名字,别名,起了个名字
- 自身其实就是编程语言中的数组或对象
2. php中的json,字符,只不过可以将php的数组和对象,通过一些方法转成json的格式
3. 任何一门编程语言中,都提供有将自身的某些数据,转成json的方法
## 真正的json的格式
1. 必须是字符
- 不允许使用双引号包裹,必须是单引号或反引号(json文件中不需要,json文件自身就是文本文件)
- 如:
- 在html文件中写css需要style标签,在css文件中不需要
- 在html文件写js需要script标签,在js文件中不需要
2. json的格式,类似于js中的对象和数组
3. 键值对的key,必须使用双引号包裹
4. 在json中不允许出现函数、undefined、NaN,可以出现null
5. 不允许出现没有意义的逗号
## js对象和json的转换
1. json字符转对象:这个字符就得符合json的格式
- JSON.parse(str);
- 需要注意json的规则
2. 对象转json字符:这个对象只需要符合js中对象的规则即可
- JSON.stringify(obj);
- 需要注意js对象或数组的规则
- 函数,undefined被忽略
- NaN,被转成null
## js对象和json的转换场景
1. 拿到后端传过来的json数据后,将json数据转成js对象,方便前端js处理
```js
var o = JSON.parse('{"name":null}');
console.log(o);
```
2. 如果需要将js对象传给后端使用,后端不能识别js对象,但可以识别json数据,需要将js对象转成json数据,发给后端
```js
var s = JSON.stringify({name:"admin"})
console.log(s);
```
```js
var s = JSON.stringify({name:"admin"})
console.log(s);
```
## 什么是json
- https://www.jianshu.com/p/658ac368e478
- https://www.jianshu.com/p/658ac368e478
# 二、面向对象编程
1. 面向对象的分析和设计
- 面向对象
- 分析和设计
- 需求:拆分,大规模的分工
- 功能之间,精密的协作
- 分工:将需求,拆分,拆分到能直接解决
- 拖拽
- 按下事件
- 移动事件
- 抬起事件
- 协作:
- 拖拽
- 按下事件
- 获取事件对象
- 移动事件
- 拿到自己的事件对象和按下的事件对象
- 抬起事件
- 清除移动
1. 面向对象的分析和设计
- 面向对象
- 分析和设计
- 需求:拆分,大规模的分工
- 功能之间,精密的协作
- 分工:将需求,拆分,拆分到能直接解决
- 拖拽
- 按下事件
- 移动事件
- 抬起事件
- 协作:
- 拖拽
- 按下事件
- 获取事件对象
- 移动事件
- 拿到自己的事件对象和按下的事件对象
- 抬起事件
- 清除移动
2. 面向的三大特点
- 封装
- 继承
- 多态
- 封装
- 继承
- 多态
3. 对象的创建
- 字面量
- `var obj = {}`
- 构造函数
- 构造内置函数
- `var obj = new Object()`
- 构造自定义函数
- `var obj = new Fn();`
4. 工厂模式创建对象
- 构造自定义函数,关键字new执行函数
- 自定义构造函数时new的的原理:
- 字面量
- `var obj = {}`
- 构造函数
- 构造内置函数
- `var obj = new Object()`
- 构造自定义函数
- `var obj = new Fn();`
4. 工厂模式创建对象
- 构造自定义函数,关键字new执行函数
- 自定义构造函数时new的的原理:
自定义构造函数时new的的原理:
1. 创建一个新对象
2. 改变函数内的this指向,为这个新对象
3. 执行函数内的代码,并将新对象的__proto__指向该函数的prototype
4. 检查函数是否主动返回对象,如果没有,则返回这个新对象
5. 多次new同一个构造函数时,会在内存中产生了多个同名功能
但它们来自于同一个模板,浪费内存
原型的出现,就是为了解决 构造函数的缺点
可以让我们更合理、方便的给实例添加方法
否则构造函数只能给实例添加属性,不能合理的添加方法
注意:在函数的 prototype 里面存储的内容,
不是给当前函数使用的,
而是给将来new函数之后得到的实例对象使用的
但它们来自于同一个模板,浪费内存
原型的出现,就是为了解决 构造函数的缺点
可以让我们更合理、方便的给实例添加方法
否则构造函数只能给实例添加属性,不能合理的添加方法
注意:在函数的 prototype 里面存储的内容,
不是给当前函数使用的,
而是给将来new函数之后得到的实例对象使用的
6. 每一个对象都天生自带一个属性, __proto__
称之为原型链对象(隐式原型),是一个引用类型数据
因为实例对象的 __proto__ 和所属的构造函数的 prototype 是同一个对象
那么就可以通过构造函数向 prototype 中添加成员
于是实例对象在访问的时候自己没有,会自动去自己的 __proto__ 中查找
最终找到了构造函数的 prototype 中的成员
解决了之前构造函数的缺点
最终找到了构造函数的 prototype 中的成员
解决了之前构造函数的缺点
结论:
属性直接写在构造函数体内
方法写在构造函数的原型上
方法写在构造函数的原型上