首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js new一个function都发生了什么

2019-04-10 03:08:56 在ES5当中其实是没有类这个概念,我们使用jsOOP编程其实是用function模拟了类实现。...这样我们就实现了一个类效果,那么new这个function时候到底都发生了什么呢,为什么fun.name值就是张三呢,如果我们直接调用TestFun.name会发生什么呢,其实这里会直接输出TestFun...这里就涉及到了作用域概念,在TestFun中,如果没有new这个关键字,这里this是指向其上层作用域。一旦使用new关键字后这个作用域就发生了变化。 我们把TestFun输出看一下。...说了这么多,new到底发生了什么呢? MDN上是这么说 function Foo(){} var o = new Object(); o....但是一般情况下如果function没有return时候这是一个正常流程,如果function return了一个Object类型,则new完成以后则会返回这个object,如果是非Object(string

1.8K30
您找到你想要的搜索结果了吗?
是的
没有找到

JS 手写: new

# 介绍 MDN-new 运算符 (opens new window) # Try it new 运算符创建一个用户定义对象类型实例或具有构造函数内置对象实例。...new Foo 等同于 new Foo(),也就是没有指定参数列表,Foo 不带任何参数调用情况。 由构造函数返回对象就是 new 表达式结果。...可以使用 Function.prototype (opens new window) 属性将共享属性添加到以前定义对象类型。...,等待被初始化 将空实例对象原型,指向构造函数原型 将构造函数内部this,强制指向该实例对象,并执行构造函数,初始化实例对象 最后返回该实例对象 /** * new * @param {Function...} constructor 构造函数 */ function New(constructor_func) { // 创建一个空实例对象,等待被初始化 var obj = {}; if (

1.2K10

理解jsnew

new 操作符 在有上面的基础概念介绍之后,在加上new操作符,我们就能完成传统面向对象class + new方式创建对象,在Javascript中,我们将这类方式成为Pseudoclassical...基于上面的例子,我们执行如下代码 var obj = new Base(); 这样代码结果是什么,我们在Javascript引擎中看到对象模型是: ? new操作符具体干了什么呢?...例如代码如下: Base.prototype.toString = function() {     return this.id; } 那么当我们使用new创建一个新对象时候,根据__proto...__特性,toString这个方法也可以做新对象方法被访问到。...于是通过函数对象和Javascript特有的__proto__与prototype成员及new操作符,模拟出类和类实例化效果。

3.3K40

js中(function(){})()写法用处

以前看到老师写js单例模式时疑惑为什么要这么写 var singleton = (function () { var privateVariable; function privateFunction...)... } }; }()); 后来查了下资料,js中(function(){…})()立即执行函数写法理解,终于了解了。...function XXX(){}1 2、一种是函数表达式 函数表达式我们经常使用,而函数表达式中function则不会出现函数提升。而是JS解释器逐行解释,到了这一句才会解释。...fn1(); function fn1(){}//可以正常调用 fn2(); var fn2 = function(){}//无法调用 OK,下面进入正题,对函数表达式加上(),是可以直接调用 但是如果是对声明式后部加上...var fn2 = function(){}();//对,就是这样 function fn1(){}();//{}会被忽略 而平常function(){}则是一种声明式,如果加上()括号后,则会被编译器认为是函数表达式

3.4K00

JS基础测试: a();function a(){console.log(1)}function a(){..}输出是多少?​

预处理会跳过执行语句,只处理声明语句,同样也是按从上到下按顺序进行。包括变量和函数在内所有声明都会在任何代码被执行前首先被处理。...注意1:对于声明并赋值语句,例如 var a = 1,在预处理阶段会把这句话拆成两句: var a; a = 1; 也就是说,赋值或其他逻辑运算是在执行阶段进行,在预处理阶段会被忽略。...注意2: (1)函数声明提升优先于变量声明提升; (2)重复var声明会被忽略掉,但是重复function声明会覆盖掉前面的声明。...2.在预处理阶段,声明变量初始值是undefined, 采用function声明函数初始内容就是函数体内容。 3....完成预处理之后,JavaScript代码会从上到下按顺序执行逻辑操作和函数调用。 参考代码: ? 答案: C. 2

3.2K20

js new Date() 默认是8点

举个栗子 // 假设当前时间是2019年12月22日0点20分 new Date('2019-12-22').getTime() < new Date().getTime() // 上面的结果是什么?...当时临时解决问题后字符串大概长这样: new Date('2019/12/22 00:00:00').getTime() < new Date().getTime() 临时解决问题。...那么为什么js会对不同分割时间字符串进行不同处理呢?貌似是因为-分隔且具有前导0日期字符串,会被解析成ISO格式字符串,以GMT时区为基准,不过我也没看懂。...动手解决: /** * 将时间字符串转换成date对象 * @param dateStr * 时间字符串 */ function getDate(dateStr){ /* 若日期是使用-...分割,全部转换成/ 因为只有日期时,js会将-分割字符串基准时区设置为GMT,与当前时区相差8小时 */ dateStr = dateStr.replace(/-/g

8.7K30

模拟实现 new 操作符(js)

首先需要理解,JavaScript 中构造函数跟 Java 中构造函数性质是不一样js 不是基于 class 这种静态类模式,而是基于原型对象模式。...所以,在 js 中,new 操作符,其实可以通俗理解成一个辅助工具,用来辅助函数构造出一个新对象。所以,我们才能够来模拟实现它,因为它其实通俗理解,就是一个工具函数。...new 职责 function A() { this.a = 1; } A.prototype.b = 1; var a = new A(); // {a: 1} a.b; // 1 所以,以上这种场景...那么返回内部创建新对象 所以,要完整模拟一个 new 工作,还得完成上面两点,先来看看对返回值处理,很简单: function _new(Fn, ...args) { // 1....没错,从引擎角度来看,的确是这样处理,但这些内部属性我们并没有办法看到啊,那对于我们这些写 js 来说,如何判断一个函数是否能够作为构造函数呢?靠经验积累?

3.5K10
领券