【js】两个难点的总结和理解,回顾原型和闭包(闭包待补充

        在学习JS的过程中,有两个比较难学和容易搞混的的地方就是原型和闭包。在学习这两点的时候一开始不抓住基本概念去理解容易走向理解的歧路,因此一开始学的时候大脑还是容易混乱不清楚的,因此基础是重点。这篇文章来简要描述下我对这两大知识点的理解,如果有不对的地方,欢迎指出,以便我及时修改

一、原型和原型链

1、原型基础知识

(1)每个函数都有prototype属性,表示每个函数具有原型。其中prototype属性默认指向一个Object空的对象,在这个对象中具有constructor属性指向函数本身。

(2)每个实例化对象具有__proto__属性,指向其构造函数的prototype属性所指向的原型对象。

(3)每个函数function的prototype为显式原型,每个实例对象的__ proto __为隐式原型,即实例对象的隐式原型就是其构造函的显式原型。

在理解了这几个知识之后,我们来分析一下构造函数创造实例的过程把~

以下是构造函数定义和构造函数创建实例的过程:

function test() {
    //里面是函数执行内容
}

var t = new test();

分析:使用关键字new过程中,首先创建了一个空的对象,然后将空对象的__proto__属性设置为构造函数的prototype的值。然后再使用test.call(该对象),将this的值变成该对象的地址值,执行了构造函数。最后把this指向的对象由t来指向。

        除此之外,我们还可以再利用构造函数test创建更多对象,例如t1、t2、t3,这几个对象的__proto__属性都是指向构造函数test的原型对象。当我们再test的原型对象添加属性值的时候,t、t1、t2、t3都可以通过它们自身带有的__proto__属性来共享test的原型对象里面的属性值。

注意:通过实例化对象的__proto__属性只可以读取构造函数原型的属性,却不可以修改,比如我给test.prototype.data设为5,我可以通过t.data来访问构造函数原型的属性data,但是如果我写t.data=8的时候就相当于给这个实例化对象添加了一个属性,因此下次再通过t.data就访问的t自己的属性而不是构造函数原型的属性。

2、原型链基础知识

        现在已经介绍了显式原型和隐式原型,接下来从隐式原型的角度来总结原型链

        每个对象在实例化的过程中都具有__proto__属性,该属性指向构造函数显式原型。当访问某个对象的属性时,发现该对象没有这个属性,所以js机制里面就会去通过访问该对象的__proto__属性找它的隐式原型,如果这个隐式原型还是没有这个属性就会继续去找这个隐式原型的__proto__属性,以此递推去找,直到我们找的这个隐式原型的__proto属性为null为止。如果还是没有找到就会返回undefined。在这个过程中,通过对象的隐式原型去寻找属性,对象和隐式原型属性形成了一条链,就是我们提到的原型链。

总结以下知识点:

(1)Object.prototype在原型链的末尾,也就是原型链的最后一个对象,其__proto__的值为null

(2)所有函数的__proto__属性都是指向Function函数对象的显式原型

(3)Function的prototype属性和__proto__属性都是指向Function的原型

(4)Object和Function都是Function的实例对象,即Object.__proto__指向Function的原型,

(5)Object的constructor指向Function

(6)Object和Function既是对象又是函数,而他们同时也是对象和函数的构造器

 

二、闭包及其应用

....待补充

相关链接:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值