1、JS中对原型的理解
prototype属性,默认对应着一个空对象(没有我们指定的方法和属性),这个空对象就是我们所说的原型对象,每一个prototype都是不相等的
function Person() {};
console.log(Person.prototype);
显示原型和隐式原型
每一个函数都有一个prototype属性,就是显示原型
每一个实例对象都有一个__proto__,就是隐式原型
实例对象的隐式原型等于对应的构造函数的显示原型的值
function Fun() {};//内部语句:Fun(this).prototype
console.log(Fun.prototype);
let fun = new Fun();//内部语句:fun(this).__proto__ = Fun.prototype
console.log(fun.__proto__);
console.log(Fun.prototype === fun.__proto__);//true
总结:
函数的prototype属性,在定义函数是自动添加的,默认是一个空对象
对象的__proto__属性,创建对象时自动添加,默认只是构造函数的prototype属性
2、JS中对原型的修改和重写
function Person(name) {
this.name = name;
};
//修改原型
Person.prototype.getName = function() {
console.log(this.name);
};
let p = new Person('小飞');
console.log(p.__proto__ === Person.prototype);//true
console.log(p.__proto__ === p.constructor.prototype);//true
//重写原型
Person.prototype = {
getName: function() {
console.log(this.name);
}
};
//p的构造函数指向根构造函数Object
let p = new Person('小飞');
console.log(p.__proto__ === Person.prototype);//p(this).__proto__ = Person.prototype true
console.log(p.constructor);
console.log(p.__proto__ === p.constructor.prototype);//false
p.constructor = Person;
console.log(p.__proto__ === p.constructor.prototype);//true
3、JS中对原型链的理解:查找对象的属性(方法)
function Fun() {
this.test1 = function (){//Fun(this).prototype = {}
console.log('test1()')
}
}
Fun.prototype.test2 = function() {
console.log('test2()')
}
console.log(Fun.prototype);
console.log(Object.prototype.__proto__);
var fun = new Fun();//fun(this).__proto__ = Fun.prototype
fun.test1();
fun.test2();
console.log(fun.toString());
4、JS中对作用链的理解
作用域:变量和函数生效的区域
全局作用域:任何不在函数中或者大括号中声明的变量,都是全局作用域下
作用链:js使用一个变量,首先js引擎会在当前作用域下查找如果没有找到,去上层作用域寻找,知道找到或者到达全局作用域,如果没有找到,直接报错或者隐式声明
5、JS中内存泄漏的几种情况
内存泄漏:由于疏忽或错误造成程序未能释放已经不再使用的内存
意外的全局变量
解决方法 " use strict " 严格模式
function fun() {
a = 10;
this.b = 20;
};
fun();
console.log(b);
定时器
var main = document.querySelector('.main');
var time = setInterval(() => {
var test = document.querySelector('.test');
main.removeChild(test)
test = null;// 解决
if(!test) {
clearInterval(time)
}
}, 2000)
闭包
function fun(name) {
function fun1() {
console.log(name);
}
return fun1;
};
let fn = fun('闭包');
fn();
fn = null;//解决
fn();
事件监听 解决方法,在不使用的时候就取消监听