隐式原型与显示原型

769 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

1.每个函数都有一个prototype,即显示原型(属性)—是在定义函数的时候自动添加的,默认值是一个空的Object对象。

2.每个实例对象都有一个__proto__,可称为隐式原型(属性)—是在创建函数对象时自动添加的,默认值为构造函数的prototype属性值。

3.对象的隐式原型的值为其对应构造函数的显式原型的值

image.png

image.png 显式原型与隐式原型保存的都是内容,即地址值,共同指向原型对象(Object是引用类型,保存的是地址值)。

这两个属性都在创建对象之后由解析器添加,因为一旦创建对象之后这个对象就可以访问了。

image.png

原型结构图

image.png

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 引擎到此将直接执行函数。

image.png

IIFE的作用

  1. 隐藏实现,外部的函数看不见。
  2. 不会污染外部(全局)命名空间。

image.png