1. 首页
  2. 分享

javascirpt中的new到底干了什么

new操作符

加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在Javascript中,我们将这类方式成为Pseudoclassical。

我们执行如下代码:

var obj = new Base();

这样执行的结果是什么,javascript引擎中看到的模型对象是: javascript引擎中模型对象

new操作符干了什么

new操作符具体干了什么呢?其实很简单,就干了三件事情。

var obj  = {};
obj.__proto__ = Base.prototype;
Base.call(obj);

第一行,我们创建了一个空对象obj 第二行,我们将这个空对象的__proto__成员指向了Base函数对象prototype成员对象 第三行,我们将Base函数对象的this指针替换成obj,然后再调用Base函数,于是我们就给obj对象赋值了一个id成员变量,这个成员变量的值是”base”


2019-09-24 更新

最近看到一个专栏介绍 this 时,讲到为什么全局调用一个函数时,this 指向的是 window 对象呢? 因为全局调用时,并没有使用 call 方法绑定上下文,或是在一个对象中的方法调用 this ,而根据作用域链的规则,会从当前作用域范围向外找,找到全局作用域中的 window 对象。

而 new 操作时,实际上是调用了 call 方法将这个空对象设置为上下文指向的对象。

可以见 MDN 的解释 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/new

不过要注意是不是在严格模式下噢,行为不同

收藏

暂无评论

登录后可以进行评论。没有账号?马上注册