js new 与 return
前置:
默认情况下, 函数的返回值是 undefined (即没有定义返回值)。
new 操作符
js 中的 new 操作符,可以是我们像 java 一样,获得一个新的对象,例如:
function Person() {
this.heart = 'red';
}
let per = new Person();
console.log(per.heart); // red
那么,在 new 的时候,内部发生了什么呢?
我们用伪代码模拟一下:
new Person() = {
var obj = {};
obj.__proto__ = Person.prototype;
var result = Person.call(obj);
return typeof result === 'object' ? result : obj;
}
- 创建一个空对象 obj;
- 设置 obj 的原型链:obj -> Person.prototype -> Object.prototype -> null;
- 在 obj 的执行环境中调用(执行) Person 函数;(或者说改变 this 的指向)
- 考察第三步的返回值,无返回值或者返回一个非对象值,则将 obj 返回作为新的对象,否则将返回值作为新的对象返回。
以上就是 new 操作符的运行机制简略版。
与 return 的化学反应
在大致理解了 new 的运行机制之后,答案就呼之欲出了:
如果我们的构造函数 return 的是简单的基本数据类型(undefinded、数字、字符串、布尔),依旧能够正确 new 出想要的对象;
如果构造函数 return 的是对象(包括基本数据类型的包装对象,如:Object('OK') 等),那么我们 new 的时候就得不到想的对象;
下面贴一个实例:
// 示例引自:https://www.jianshu.com/p/ed692646ee7c
function User( name, age){
this.name = name;
this.age = age; // return; // 返回 this
// return null; // 返回 this
// return this; // 返回 this
// return false; // 返回 this
// return 'hello world'; // 返回 this
// return 2; // 返回 this // return []; // 返回 新建的 [], user.name = undefined
// return function(){}; // 返回 新建的 function,抛弃 this, user.name = undefined
// return new Boolean( false); // 返回 新建的 boolean,抛弃 this, user.name = undefined
// return new String( 'hello world'); // 返回 新建的 string,抛弃 this, user.name = undefined
// return new Number( 32); // 返回 新的 number,抛弃 this, user.name = undefined
}
var user = new User("小白",20)
console.log(user);
js new 与 return的更多相关文章
- js arrow function return object
js arrow function return object bug filterData: { type: Object, default: () => {}, required: true ...
- js中的return,return true,return false小结
return 函数执行到这句时会终结,并返回调用函数,而且把表达式的值作为函数的结果返回 return false 可以防止默认的事件行为.例如,默认情况下点击一个<a>元素,页面会跳转 ...
- 在div+css中用到的js代码注意return
今天做了一个项目,美工做好后放在了form中(没有加runat=server),由于用到了服务器控件,所以这里要加,否则报错,关键一段div代码是: <form id="form_re ...
- a链接的onclick与js中的return false
在学习<javascript基础教程>第八版时,有一个小细节开始不是很明白,查了一些资料后,理了一下思路. 例子的html代码: <!DOCTYPE html> <htm ...
- js事件处理程序return false ,preventDefault,returnValue
面试题目中,经常会被问到如何阻止默认行为. 以下是<javascript权威指南>书中的内容,详情可以去看书. 能够取消事件默认操作的方法有三种 1.属性注册的事件处理程序的返回值fals ...
- js中的 return false;
总的来说return false 的作用就是阻止事件的默认行为 1. function check() { if(form.title.value=="") { alert(&qu ...
- JS构造函数中有return
function foo(name) { this.name = name; return name } console.log(new foo('光何')) function bar(name) { ...
- JS 三目运算符和RETURN
以前写的博客,现在搬过来 首先三目运算符和return的正确用法是这样的: (function test(){ var foo = []; return typeof foo === 'object' ...
- js中的return
retrun true: 返回正确的处理结果. return false:分会错误的处理结果,终止处理. return:把控制权返回给页面(如果条件满足,后面的逻辑就不执行了). if(this.in ...
随机推荐
- [Algo] 118. Array Deduplication IV
Given an unsorted integer array, remove adjacent duplicate elements repeatedly, from left to right. ...
- [浅学]POST、GET、PUT、DELETE 请求
HTTP定义了与服务器交互的不同的方法,最基本的是POST.GET.PUT.DELETE,与其比不可少的URL的全称是资源描述符,我们可以这样理解: url描述了一个网络上资源,而post.get.p ...
- intellij idea安卓开发配置
1.java sdk 2.java ndk 3.gradle https://gradle.org/install/#manually 配置properties 删除根目录下android{} htt ...
- springmvc中那些易被忽略的小知识点
1.springmvc会为没有view的modelandview指定默认view 知道这个的时候我都惊呆了. 我从来都是手动指定view名字,今天看到别人写的代码竟然直接返回了个mav,貌似是在dis ...
- Collection接口介绍
Collection接口介绍 一个Collection代表一组对象,是集合体系中的根接口.一些允许有重复的元素一些不允许,一些有顺序一些没有顺序.JDK不提供此接口具体类的直接实现,只会有子接口和抽象 ...
- 二、NOSQL之Memcached缓存服务实战精讲第一部
1.Memcached是一套数据缓存系统或软件. 用于在动态应用系统中缓存数据库的数据,减少数据库的访问压力,达到提升网站系统性能的目的:Memcached在企业应用场景中一般是用来作为数据库的cac ...
- Kaggle——NFL Big Data Bowl
neural networks + feature engineering for the win 导入需要的库 import numpy as np import pandas as pd impo ...
- flutter 命令卡主的问题
情况 1 镜像的问题 如果你的镜像已经设置,却仍然卡主,那么请参考情况 2 这种情况在中文官网上已经有了,并且有这修改镜像的方法,附上链接: https://flutter.cn/community/ ...
- 自定义View淡出动画
//AllGestureView为自定义view AllGestureView *gestureView=[[AllGestureView alloc]init]; gestureView.frame ...
- SaltStack事件驱动 – event reactor
Event是SaltStack里面的对每个事件的一个记录,它相比job更加底层,Event能记录更加详细的SaltStack事件,比如Minion服务启动后请求Master签发证书或者证书校验的过程, ...