1.什么是构造函数
构造函数本身也是一个函数,只不过这个函数在定义的时候首字母一般需要大写;构造函数调用的时候,必须通过一个new关键字来调用;我们一般不直接使用构造函数,而是使用构造函数创建出来的实例对象,构造函数是js面向对象的一个重要组成部分.
function Star(uname, age) {
this.uname = uname
this.age = age
this.sing = function() {
console.log('我会唱歌')
}
}
const ldh = new Star('刘德华', 18)
const zxy = new Star('张学友', 19)
2.什么是原型对象
每一个构造函数都有一个prototype的属性,这个属性的值是一个对象,这个对象就叫做构造函数的原型对象;一般建议将构造函数的成员属性绑定在原型对象prototype上,因为原型对象prototype身上的属性默认可以通过实例对象访问到;这样做可以保证在每次通过new关键字创建实例对象的时候,这些方法不会被重复在内存中创建.
3.什么是原型链
每个构造函数都有一个prototype属性,即原型对象,通过实例对象的__prototype__属性也可访问原型对象,最终形成的链状的结构称为原型链
4.js中实现继承的方式
ES6 之前官方并没有提供一种实现继承的语法,所以大部分继承方式都是程序员通过代码在模拟. 常见的继承方式有以下几种:
原型继承
借用构造函数继承
组合继承
function Student(name, age, gender, score) {
// 通过构造继承属性
Person.call(this, name, age, gender);
}
// 通过原型继承,继承方法
Student.prototype = new Person();
// 修改 constructor 的指向
Student.prototype.constructor = Student;
// 动态添加成员方法
Student.prototype.printScore = function () {
console.log("my score is " + this.score);
};
// 创建 Student 实例对象
var s1 = new Student("zs", 30, "男", 90);
s1.sayHi();
s1.printScore();
ES6之后使用extends 关键字实现继承(class Student extends Person{})
5.闭包
闭包是一个跟函数相关的概念,表现形式是一个父函数内部,嵌套了一个子函数,子函数直接或间接的被返回给外部作用域,并且子函数中会使用到父函数局部作用域中的变量,当我们在外部调用这个子函数的时候,就会发生闭包现象.
大白话就是: 闭包 = 内层函数 + 外层函数的变量
function fn() {
let count = 1;
function fun() {
count++;
console.log(`函数被调用${count}次`);
}
return fun;
}
const result = fn();
result(); // 2
result(); //3
闭包的作用:
-
实现数据私有,无法直接修改count
-
闭包可以延展一个函数的作用域
注意事项:
不能滥用闭包,会导致内存泄露
6. 什么是内存泄露
内存泄露是指本应该被垃圾回收机制回收的内存空间由于某种特殊原因没有及时被回收,称之为内存泄露,滥用全局变量和滥用闭包都会导致内存泄露