这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战markdown
原型链涉及原型对象和原型链是如何产生的闭包
一、原型对象函数
大部分的函数都有一个prototype属性,这个属性就算原型对象用来建立新对象的实例,新建立的对象也会又prototypr属性,由于都有prototype属性从而实现共享原型对象,因此这些对象均可以访问原型对象的属性。post
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对象中可是能够访问,说明对象中是经过原型链拿到的方法学习
二、原型链spa
把对象打印出来的话,能够看到每一个对象都有一个_proto_属性,这个属性就指向构造函数constructor的原型。每一个对象能够经过这个属性和上游的构造函数的原型对象链接起来,而上游对象也有_proto_属性,这样就好像产生了一个闭环,就是原型链。prototype
闭包是函数和声明函数的词法环境的组合,常规理解就算函数体内能够访问的变量的总和,不要是一个函数里套着一个函数啦。code
(function() {
let a = 1;
function calculate() {
let b = 2;
let total = a+b;
console.log(total);
}
calculate();//能够访问内部变量a,组合在一块儿就是闭包});
复制代码
闭包能够隐藏变量,由于内部函数能够访问外部函数的变量,即便外部函数被return以后。orm
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,天天学习一点点,天天进步一点点,每天向上!