标签:function __ 函数 Person 面向对象 var 对应
面向对象
编程思维oop,核心就是找有对应方法的对象做对应的事情(万物皆对象)
面向过程:按对应的步骤走
创建对象
1.通过class创建 等同于通过构造方法创建 1>首字母必须大写 2>可以指定默认参数 3>如果没有参数可以省略括号
class Person {
// 构造函数
constructor() {
}
}
var person = new Person() // 返回Person对象
构造函数是1个匿名函数,它的名字就是对应的class名字
// 构造函数 里面可以传递参数
function Person(name="tom", age=18) {
// 拥有this指向 this指向new的对象实例
this.name = name
this.age = age
}
var o = new Person()
2.通过工厂方法模式创建(设计模式 类似于一个复用工厂 出厂对应的对象 Object属于对象超类 所有对象默认继承Object)
function factor(name) {
var obj = new Object()
obj.name = name
return obj
}
var person = factor("jack") // 返回Object
3.通过字面量创建
var person = {
name: "tom",
age: 18
}
原型
prototype
prototype是每个函数都有的对象空间 存储一些东西
constructor
会指向对应对象的构造函数
prototype拥有的方法
A.hasOwnProperty(b) 返回一个boolean类型的值 判断当前对象A是否存在对应的属性b
A.isProtoTypeOf(b) 返回1个boolean值 判断实例b是否具备对应的构造器原型A
构造函数也是1个函数 所有具备内存空间prototype
prototype是属于构造函数的 可以往里设置属性和方法 可以通过实例.调用
存储在原型上的内容可以直接通过对象实例.获取
function Person() {
}
Person.prototype.name = 'Tom'
var p = new Person()
p.name // Tom
__proto__
所有对象都具备1个属性__proto__ 指向对应构造函数的prototype
var obj = {
}
console.log(obj.__proto__)
原型链
1.构造函数的prototype是1个对象 里面可以存放对应的数据(不会2次开辟空间)
2.实例对象的__proto__ 指向构造函数的prototype
3.构造函数也是对象 它的__proto__指向Object
对象在构造器原型(__proto__)找属性的过程称为原型链
- 先找自己的属性
- 再找父类__proto__
- 直到Object
- 最后找到null并返回
原型链是会忽略对象的赋值的
- 没有就创建这个属性
- 有就更改这个属性
- 它跟__proto__没有关系
我们一般将对应属性存在构造方法里,对应方法存在原型上
继承
父类拥有的属性及相关方法子类可以获取(私有的不能获取)
继承的实现方式
es6 extends关键词实现继承class
class Person {
constructor() {
}
}
class Son extends Person {
constructor () {
super() // 如果需要this指向父类
}
}
原型继承
function Person() {
}
function Son() {
}
Son.protype = new Person()
通过this指向来继承
function Person() {
}
function Son() {
Person.call(this) // 更改对应Person的this指向,指向Son的实例对象
}
组合继承
function Person() {
this.name = "ki"
}
function Son() {
Person.call(this) // 更改对应Person的this指向,指向Son的实例对象
}
// 原型继承
Son.protype = new Person()
闭包
函数的执行过程
1.预编译
先开辟1个内存空间装函数对象
在对应的内存空间上再开辟1个代码块空间装代码
2.执行
找到函数的对象空间,在这个对象空间上开辟1个执行空间
再将对应的代码块空间合并到执行空间
执行完毕销毁执行空间对应合并的代码块空间也会被销毁
对应的代码块里面的内容就会按垃圾回收机制回收
function fn() {
var num = 0
num++
console.log(num)
}
fn() // 1 执行完num会被回收
fn() // 1
对应的流程走完后,函数代码块里声明的变量会全部回收
第1次和第2次执行函数里的变量不是1个
如果想要数据不回收
开辟1个与执行空间无关的空间存储数据
function fn () {
return new Object()
}
闭包的概念
1.在函数内部return函数
2.函数内部要存储对应外部函数的引用
3.这个数据不会被回收
闭包优点
1.持久化 可以作为缓存
2.不会造成数据全局污染 (外部内容不能直接访问函数的变量)
缺点
1.因为不会被回收,那么内存空间会一直占用
2.会一直保持引用
function sum () {
let num = 10
return function () {
num++
}
}
var fn = sum() // 返回1个函数
fn() // 11
fn() // 12
sum()() // 11
sum()() // 11
闭包的应用
防抖
概念:在规定时间内函数只执行最后1次
function antiShake () {
var timer
return function () {
clearTimerout(timer) // 清除上一次延时器
timer = setTimeout(()=> {
console.log(666)
}, 3000)
}
}
节流
概念:在规定时间内函数执行第1次 可以执行多次
function throttle() {
var flag = false
if (flag) {
return
}
return function () {
setTimeout(()=>{
console.log(666d)
flag = true
},3000)
}
}
防抖和节流的区别
节流 在规定时间内执行第1次 可以执行多次
事件处理
防抖 只会在规定时间内执行最后1次 执行1次
函数柯里化(颗粒化)
概述:将多个参数的方法拆分为多个1个参数的方法
// 普通函数
function sum (a, b) {
return a + b
}
var num = sum(10, 20)
console.log(num) // 30
// 函数柯里化
function fn (a) {
return function (b) {
return a + b
}
}
console.log(fn(10)(20)) // 30
函数柯里化优点
1.可以节省不必要写的参数,简化对应的代码,提高代码可读性
标签:function,__,函数,Person,面向对象,var,对应 来源: https://www.cnblogs.com/AiZink/p/16420844.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。