javascript 原型链、执行环境、作用域链、实例对象之间的关系

javascript 原型链、执行环境、作用域链、实例对象之间的关系


原型链:
在创建一个函数时,就自动为该函数添加一个prototype属性,该属性指向原型对象,默认情况下,该对象中只包块一个constructor属性,它是一个指向prototype属性所在函数的指针。
当我们在调用该函数作为构造函数创建一个实例时,该实例将存在一个内部属性_proto_,它是一个指针指向该函数的原型指针。
当我们在实例化时,实例将生成实例属性和实例方法,它们与内部属性_proto_指针在同一个对象列表里。
执行环境:
所有javascript代码都是在一个执行环境中被执行的,当调用一个javascript函数时,该函数就会进入相应的执行环境,如果又调用另外一个函数,则又会创建一个新的执行环境,当调用函数返回后,执行过程会返回原始的执行环境,因此,运行中的javascript代码就构成了一个执行环境栈。在一个函数的执行环境中,会创建一个活动“对象”,接下来创建一个 类数组的arguments对象,它以整数索引的数组成员一一对应地保存着调用函数时所传递的参数,同时具备length,callee等属性,然后活动对象创建一个名为arguments的属性,该属性引用前面创建的arguments对象。接着为执行环境分配作用域,指定给一个函数调用执行环境的作用域,由该函数的scope属性所引用的对象列表链组成, 同时,活动对象呗添加到该对象列表的顶部,即链的前端。最后来说this,如果赋的值是一个对象的引用,则this指向该对象,如果赋null,则this指向全局对象。活动对象包含了arguments,this,及其可变对象属性。顺便提下with,如果该表达式是一个对象,那么就将这个对象添加到当前执行环境的作用域链中(在活动可变对象之前),执行完with语句块之后,又恢复到之前的作用域链。



作用域链
当某个函数第一次被调用时,会创建一个执行环境及相应的作用域链,并把作用域链赋值给一个特殊的内部属性Scope,作用域链包括了一系列活动对象,第一位的是当前函数的this,arguments和其他命名参数的值来初始化的对象。然后从内向外的顺序创建活动对象,直到全局作用域对象。
总结一下他们的关系 当函数作为构造函数调用时,比如:
function a(s){this.s=s;}
a.prototype.say=function(){alert(this.s);}
var A=new a("ss");
A.say();
在创建函数a时:该函数就有一个prototype属性,它指向原型对象。
后来我们实例化函数a,也就是执行了a,该对象A具有_proto_属性,它指向原型链,而此时执行函数a时,a具有一个Scope属性,它指向作用域链。
该执行环境中的变量可能对原型对象实例化时有影响,就像这里的s。
此时调用A.say()调用的是原型中的say方法。
如果改为:
functiona(s){this.s=s;this.say=function(){alert("aa");}}
再次调用A.say()则调用构造函数中的方法,因为对象有一个属性和对象列表,它会优先查找构造函数中的属性和方法,如果没有找到,才会通过_proto_指针去查找原型链中的方法。
通过delete可以删除实例属性:
delete A.s则删除该实例的s属性
再次调用A.say()就会显示undefined
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值