javascript对象创建过程

       JS中只有函数对象具备类的概念,因此要创建一个对象,必须使用函数对象。函数对象内部有[[Construct]]方法和[[Call]]方法,[[Construct]]用于构造对象,[[Call]]用于函数调用,只有使用new操作符时才触发[[Construct]]逻辑。
       var obj=new Object();
是使用内置的Object这个函数对象创建实例化对象objvar obj={};var obj=[];这种代码将由JS引擎触发ObjectArray的构造过程。function fn(){}; var myObj=new fn();是使用用户定义的类型创建实例化对象。

       new Fn(args)
的创建过程如下(即函数对象的[[Construct]]方法处理逻辑,对象的创建过      )。另外函数对象本身的创建过程(指定义函数或者用Function创建一个函数对象等方式)虽然也使用了下面的处理逻辑,但有特殊的地方,后面再描述。


1.
创建一个build-in object对象obj并初始化
2.
如果Fn.prototypeObject类型,则将obj的内部[[Prototype]]设置为Fn.prototype,否则obj[[Prototype]]将为其初始化值(Object.prototype)
3.
obj作为this,使用args参数调用Fn的内部[[Call]]方法

    3.1
内部[[Call]]方法创建当前执行上下文
    3.2
调用F的函数体
    3.3
销毁当前的执行上下文
    3.4
返回F函数体的返回值,如果F的函数体没有返回值则返回undefined
4.
如果[[Call]]的返回值是Object类型,则返回这个值,否则返回
obj
注意步骤2中, prototype指对象显示的prototype属性,而[[Prototype]]则代表对象内部Prototype属性(隐式的)

构成对象Prototype链的是内部隐式的[[Prototype]],而并非对象显示的prototype属性。显示的prototype只有在函数对象上才有意义,从上面的创建过程可以看到,函数的prototype被赋给派生对象隐式[[Prototype]]属性,这样根据Prototype规则,派生对象和函数的prototype对象之间才存在属性、方法的继承/共享关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值