js中的作用域链和原型链

最在在学习前端一些技术,首先就看了js红宝书,觉得这本书确实讲的很细致,值得看,接下来就是根据我看的我自己理解的对作用域链和原型链的总结。

作用域链:提到作用域链,大家应该都会想到一个名词执行环境,执行环境就是代码执行时的作用域,与执行环境相对应的一个就是变量对象,每一个执行环境都对应一个变量对象,变量对象是存储该执行环境里函数和变量的一个对象。当代码执行的时候,会根据变量对象生成一个作用域链。作用域链的前端总是当前执行环境的变量对象。作用域链的下一个变量对象是包含环境,而再下一个变量对象是包含环境的包含环境,……最后一个变量对象总是全局执行环境对应的变量对象。

变量对象中保存的是该变量对象对应的执行环境中所定义的变量和函数,每一个变量对象中都有一个argument属性,该属性是一个类数组对象。

作用域链有个特点,作用域链只能支持向上搜索,而不支持向下搜索,就是当前执行环境中可以访问其包含环境中的变量和函数,而不可以访问其被包含环境中的变量和函数。

而原型链是在继承的时候用的一个很重要的概念。其基本思想就是通过原型让一个引用类型来使用另一个引用类型的属性和函数。

下面我通过一个简单的例子来说明使用原型链实现继承。

function A(){

    this.property=true;

}

A.prototype.getAValue=function (){

    return this.property;

}

function B(){

    this.myproperty=false;

}

B.prototype=new A();

B.prototype.getBValue=function (){

    return this.myproperty;

}


var instance = new B();

console.log(instance.property);

console.log(instance.getAValue());//true

加粗部分就是B继承A。

而他的原理是这样的

因为每一个对象中都有prototype这个属性,这个属性是一个对象,该对象指向的是该属性所在构造函数的原型对象。A.prototype指向的是A的原型对象,而B.prototype指向的是B的原型对象。B.prototype=new A()。实际上是将B的原型对象中的[[Prototype]]的指向改变为A的原型对象。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值