javascript new操作符学习

使用new调用构造函数实际上会经历以下 4个步骤:
(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) ;
(3) 执行构造函数中的代码(为这个新对象添加属性) ;
(4) 返回新对象。
var obj = {};
obj.__proto__ = Base.prototype;
Base.call(obj);
第一行,我们创建了一个空对象obj
第二行,我们将这个空对象的proto成员指向了Base函数对象prototype成员对象
第三行,我们将Base函数对象的this指针替换成obj,然后再调用Base函数,于是我们就给obj对象赋值了一个id成员变量,这个成员变量的值是”base”,关于call函数的用法。
new一个对象发生了什么:
(我的 简单理解)
function NEW_OBJECT(Foo){
var this={};// 隐式 定义this 为一个对象
this.__proto__=Foo.prototype;//this对象中 不是空的 ,默认 有一个 __proto__ 指向 构造函数的原型
this.__proto__.constructor=NEW_OBJECT;// 还会在 __proto__ 中 定义 constructor属性为 当前的构造函数
//上方的this 的创建 更精准的写法: Object.create(NEW_OBJECT.prototype);
return this;//隐式 的 返回 这个 this ,从而将 this 指向了 构造出的 对象实例
}
模拟一个new的实现:
function NEW_OBJECT(Foo){
var obj={};
obj.__proto__=Foo.prototype;
obj.__proto__.constructor=Foo;
Foo.apply(obj,arguments)
return obj;
}
版权声明:
作者:东明兄
链接:https://blog.crazyming.com/note/1308/
来源:CrazyMing
文章版权归作者所有,未经允许请勿转载。


共有 0 条评论