这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战
一、原型链
原型链涉及原型对象和原型链是如何产生的
1、原型对象
大部分的函数都有一个prototype属性,这个属性就算原型对象用来创建新对象的实例,新创建的对象也会又prototypr属性,因为都有prototype属性从而实现共享原型对象,所以这些对象都可以访问原型对象的属性。
let obj = {
name: 'yumiao',
age: '18'
}
console.log(obj.hasOwnProperty('name'));//true
console.log(obj.hasOwnProperty('hasOwnProperty'));//false
console.log(Object.prototype.hasOwnProperty('hasOwnProperty'));//true
obj.hasOwnProperty();//这个方法就是在Object的原型对象中,可以被任何对象当作自己的方法使用
上面的hasOwnProperty并不在Obj对象中但是可以访问,说明对象中是通过原型链拿到的方法
2、原型链
把对象打印出来的话,可以看到每个对象都有一个_proto_属性,这个属性就指向构造函数constructor的原型。每个对象可以通过这个属性和上游的构造函数的原型对象连接起来,而上游对象也有_proto_属性,这样就好像产生了一个闭环,就是原型链。
二、闭包
闭包是函数和声明函数的词法环境的组合,常规理解就算函数体内可以访问的变量的总和,不要是一个函数里套着一个函数啦。
(function() {
let a = 1;
function calculate() {
let b = 2;
let total = a+b;
console.log(total);
}
calculate();//可以访问内部变量a,组合在一起就是闭包});
闭包可以隐藏变量,因为内部函数可以访问外部函数的变量,即使外部函数被return之后。
三、JavaScript的变量提升
js引擎的工作方式是先解析代码,获取所有被声明的变量,然后一行一行的运行代码。其中每行定义变量的语句会被先放到代码头部执行,就是变量提升。
console.log(1,a);//undefined
var a = 1;
function b() {
console.log(2,a);//1
}
b();
其中第一行打印出来是undefined,是因为代码是这样执行的:
var a = undefined;
console.log(1,a);
a = 1;
function b() {
console.log(2,1);
}
b();
把var a = 1提升到代码第一行,并且默认赋值未undefined,然后a=1还是在原来的位置,所以第一次打印出来a是undefined,后面就是一行一行执行。
enmmm,每天学习一点点,每天进步一点点,天天向上!