JS的函数的什么调用调用问题

JavaScript 中经常使用构造函数的什么调用創建对象(通过 new 操作符调用一个函数的什么调用)那在使用 new 调用一个函数的什么调用的时候到底发生了什么?先看几个例子再解释背後发生了什么。

构造函数的什么调用***没有 return 语句这也是使用构造函数的什么调用时默认情况,***会返回一个新对象如下:

这是常见的使用構造函数的什么调用创建对象的过程,打印出来的是 {age: 111}

打印出来的是 {type: '我是显式返回的'},也就是说return 之前的工作都白做了,***返回 return 后面的对象

那是不是只要构造函数的什么调用体内***有 return,返回都是 return 后面的数据呢

我们看下返回基本类型数据的情况:

打印出来的是 {age: 333},和没有 return 时效果┅样跟预期不一样,背后你原理看下面分析

2.1 非箭头函数的什么调用的情况

这也就解释了如果构造函数的什么调用显式返回对象类型,則直接返回这个对象而不是返回最开始创建的对象。

  10)如果 F 返回的不是对象类型(第 9 步不成立)则返回创建的对象 obj。

如果构造函数的什么调用没有显式返回对象类型(显式返回基本数据类型或者直接不返回)则返回最开始创建的对象。

2.2 箭头函数的什么调用的情况

那如果构造函数的什么调用是箭头函数的什么调用怎么办

箭头函数的什么调用中没有 [[Construct]] 方法,不能使用 new 调用会报错。

  相关规范在 ES6 的官方文档 Φ有提但自从 ES6 以来的官方文档巨难懂,在此不做表述

三、new 调用函数的什么调用完整过程

3.1 中文描述及相关代码分析

除了箭头函数的什么調用之外的任何函数的什么调用,都可以使用 new 进行调用背后发生了什么,上节英文讲述的很清楚了再用中文描述如下:

2)给 obj 设置原生對象的内部属性;(和原型属性不同,内部属性表示为 [[PropertyName]]两个方括号包裹属性名,并且属性名大写比如常见 [[Prototype]]、[[Constructor]])

6)如果 proto 是对象类型,则設置 obj 的内部属性 [[Prototype]] 值为 proto;(进行原型链关联实现继承的关键)

8)9)10)见上节分析。(决定返回什么)

对于第 7 步的情况见下面代码:

  1. // 因为實例是一个对象类型的数据,默认会继承内建对象的原型  
  2. // 如果构造函数的什么调用的原型不满足形成原型链的要求,那就跳过直接和内建对象原型关联  

3.2 更简洁的语言描述

2)给新对象的内部属性赋值关键是给[[Prototype]]属性赋值,构造原型链(如果构造函数的什么调用的原型是 Object 类型则指向构造函数的什么调用的原型;不然指向 Object 对象的原型);

3)执行函数的什么调用 Foo,执行过程中内部 this 指向新创建的对象 o;

4)如果 Foo 内部顯式返回对象类型数据则,返回该数据执行结束;不然返回新创建的对象 o。

因为函数的什么调用的原型可以被改写所以会出现在 x 通過 Foo new 出来之后完全改写 Foo 的原型 x instanceof Foo 返回 false 的情况。因为实例创建之后重写构造函数的什么调用原型实例指向的原型已经不是构造函数的什么调用嘚新的原型了,见下面代码:


100%CPU性能计算能力不缩水!精选最主流云服务器,满足各种业务需求还有百款热门云产品和8888元开工大礼包,助力行业复工!

这样形参就有了值, 在函数的什么调用...

js里的function是一個特殊的对象 函数的什么调用定义函数的什么调用有两种定义方法:定义表达式如var f = function(){}; 和声明语句如function f(){}。 须知在变量提前这一现象中声明语呴可被提前,而定义表达式虽然声明语句被提前但赋值并未被提前,因此在表达式前调用该函数的什么调用会得到undefined 函数的什么调用声奣语句不能出现在循环、条件...

使用【函数的什么调用模板】时,通过填写必选的函数的什么调用名称、运行环境等配置依赖等函数的什么調用模版中的配置来完成函数的什么调用的创建 更多创建方式您可根据实际需求,选择更多方式创建函数的什么调用: 使用 scf cli 命令行工具可参考 使用 cli 创建函数的什么调用,以及函数的什么调用的调用和部署 使用 vs code ,可参考 使用 vs code 插件创建函数的什么调用以及函数的什么调鼡的调试和...

我要回帖

更多关于 函数的什么调用 的文章

 

随机推荐