var a = new B()
这么一句话,过程是怎么样的?
网上看到,实例化过程大概这样
使用了new关键字后,B类内会发生这样一个过程
B() {
this = {} //第一步
this.name = 'car'; //第二步
return this; //第三步
}
这是对的吗?上面代码应该只是对这个过程的描述而已吧,js内部实现确实是这样吗?
如果要研究内部的运行机制,那建议你看ECMAscript5/6。
new 是js函数调用的一种方式
说js实例化有点牵强,在java中,有类和对象。
类是一个模板,对象就是它的实例化。而在javascript中没有类的概念,一切皆对象。
function A( name ){
this.name = name;
}
function ObjectFactory(){
var obj = {},
Constructor = Array.prototype.shift.call( arguments );
obj.__proto__ = typeof Constructor.prototype === 'number' ? Object.prototype : Constructor.prototype;
var ret = Constructor.apply( obj, arguments );
return typeof ret === 'object' ? ret : obj;
}
var a = ObjectFactory( A, 'xuecheng' );
console.log(a.name);
上面这段代码实现了new关键字的功能,js模拟创建对象过程。
在语法上跟new关键字不同,new关键字语法功能是浏览器对ECMAScript
的实现。
通过这段代码我们看看实例化一个对象需要具备哪些东西。
①首先需要在内存中创建一个空对象,{}
这种语法被称为字面量表示法,通过这种语法,浏览器在内存中创建一个对象。
②然后将等价于new关键字(在功能上等价)的函数ObjectFactory
第一个参数作为实例对象的构造函数,简历索引关系。
③通过__proto__建立实例对象与原型对象的联系。
④将构造函数的属性方法创建一份副本并挂载到实例对象上,最后返回实例化完成的对象。
大致过程如以上部分,当然这是通过js来模拟实现的,具体浏览器如何实现要看浏览器的源代码(一般为c++程序)。
这个:https://.com/n/1330000004559982更精确一些。
如果你想深入,建议去看ECMAScript规范中关于new
关键字的语意描述部分。
当然,如果有能力你可以去找个JS引擎的源码去看一下。