js闭包与继承

闭包

概念
能够读取其他函数内部变量的函数。或简单理解为定义在一个函数内部的函数,内部函数持有外部函数内变量的引用。大函数中返回小函数,小函数使用了大函数的变量,在全局中能直接访问到小函数

写法

 function fn(){
        var n = 123;
        function f(){
            console.log(n);
        }
        return f;//将函数f()返回到fn()
    }
    var a = fn();
    a();

特点
1.里面的小空间不销毁,延长了变量的声明周期
2.保护了私有的变量不被全局污染,让数据更安全
3.让全局可以访问到局部的数据了
缺点:就是内存不销毁,容易造成内存溢出/内存泄漏
原因:fn是f的父函数,f被赋给了一个全局变量,f始终存在内存中,f的存在依赖fn,因此fn也始终存在内存中,不会在调用结束后,被垃圾回收机制回收。

继承

1.原型继承

function Dog(){
    this.eyes = "两只眼睛";
    this.leg = "四条腿";
}
function Jinmao(){
    this.name = "金毛";
    this.weight = "中大型";
}
Jinmao.prototype = new Dog();
Dog.prototype.constructor = Dog;
var jinmao = new Jinmao();
console.log(jinmao)

原型天生自带属性constructor,指向构造函数
但是,一旦使用原型继承,这个原型上没有constructor属性了
使用原型继承的时候,应该手动添加constructor属性,让新的原型也指向构造函数

2.借用函数继承/上下文调用模式继承

function Dog(){
    this.eyes = "两只眼睛";
    this.leg = "四条腿";
}
function Jinmao(){
    Dog.call(this);
    this.name = "金毛";
    this.weight = "中大型";
}
var jinmao = new Jinmao();
console.log(jinmao);
var dog = new Dog();
console.log(dog);

使用call改变this 的指向
特点:1、只继承了父类构造函数的属性,没有继承父类原型的属性。
   2、解决了原型链继承缺点。
   3、可以继承多个构造函数属性(call多个)。
   4、在子实例中可向父实例传参。
缺点:1、只能继承父类构造函数的属性。
   2、无法实现构造函数的复用。(每次用每次都要重新调用)
   3、每个新实例都有父类构造函数的副本,臃肿。

3.组合继承

function Dog(){
    this.eyes = "两只眼睛";
    this.leg = "四条腿";
}
Dog.prototype.food=function(){
    console.log("骨头")
}
function Jinmao(){
    Dog.call(this);
    this.name = "金毛";
    this.weight = "中大型";
}
Jinmao.prototype = new Dog();
var jinmao = new Jinmao();
console.log(jinmao);
jinmao.food();
var dog = new Dog();
console.log(dog);

结合原型继承和构造函数继承的特点

4.es6语法继承

calss 类 extends 父类{}
function Dog(name){
    this.eyes = "两只眼睛";
    this.leg = "四条腿";
    this.name = name;
}
class Jinmao extends Dog{
    constructor(name){
        super(name)
    }
}
var jinmao = new Dog("金毛");
console.log(jinmao); 

extends关键字并不能执行父类的constructor 如果父类有constructor,子类这里(constructor里面)必须调用一个叫做super的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值