一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
1.每个函数都有一个prototype,即显示原型(属性)—是在定义函数的时候自动添加的,默认值是一个空的Object对象。
2.每个实例对象都有一个__proto__,可称为隐式原型(属性)—是在创建函数对象时自动添加的,默认值为构造函数的prototype属性值。
3.对象的隐式原型的值为其对应构造函数的显式原型的值
显式原型与隐式原型保存的都是内容,即地址值,共同指向原型对象(Object是引用类型,保存的是地址值)。
这两个属性都在创建对象之后由解析器添加,因为一旦创建对象之后这个对象就可以访问了。
原型结构图
funtion Fn() {
}
var fn = new Fn() //fn是Fn的实例对象
console.log(Fn.prototype,fn.__proto__)
console.log(Fn.prototype===fn.__proto__)
//如何给所有实例对象添加方法?通过原型
Fn.prototype.test = function () {
console.log('test()')
}
fn.test()
首先在堆中创建一个Function对象,之后在栈中保存函数名,保存的内容是地址值,该地址值指向的是这个Function对象;
实例对象的proto属性在创建的时候会自动有一个赋值操作,所以显示原型和隐式原型指向的同一个地方。
IIFE
立即调用函数表达式,即匿名函数自调用
是一个在定义时就会立即执行的 JavaScript 函数。
(function () {
statements
})();
这是一个被称为 自执行匿名函数 的设计模式,主要包含两部分。第一部分是包围在 圆括号运算符 () 里的一个匿名函数,这个匿名函数拥有独立的词法作用域。这不仅避免了外界访问此 IIFE 中的变量,而且又不会污染全局作用域。
第二部分再一次使用 () 创建了一个立即执行函数表达式,JavaScript 引擎到此将直接执行函数。
IIFE的作用
- 隐藏实现,外部的函数看不见。
- 不会污染外部(全局)命名空间。