JavaScript学习笔记之constructor,proto

2017-11-07  本文已影响0人  boborz

引言

在学习JavaScript时,不可避免的接触到了原型原型链的概念,结果被constructorprototype__proto__这些属性搞得一脸懵逼,这些都是什么鬼!!!通过谷歌浏览器调试时,看对象实例的内部结构,这三个属性也是你中有我,密不可分,完全理不清头绪。最后通过理清概念,不断验证,最终有了一些思路。

概念

要想真正弄清楚constructorprototype__proto__这些属性的之间的区别和联系,首先我们要明确定义:

事例

下表列出了实例对象和函数对象的区别:

constructor prototype __proto__
A ✔︎ ✔︎ ✔︎
a ✔︎ ✔︎

由上表可以看出实例对象是没有prototype属性的,只有函数对象才有(这一点很重要!!!),下面用代码来具体解释下以上三个属性的关系:

<script type="text/javascript">
    function A() {};
   
    var a = new A();
</script>

JavaScript实际上执行的是:

<script type="text/javascript">
    function A() {};

    var a = new Object();
    a.__proto__ = A.prototype;
    A.call(a);
</script>

其中A.prototype也是个对象,它由constructor__proto__属性组成 (这一点很重要!!!),它的构造过程如下:

A.prototype = new Object();
A.prototype.constructor = A;
A.prototype.__proto__ = Object.prototype;

ObjectFunction原型对象

验证

我们通过谷歌浏览器来进行调试,来验证我们的结论,先来看下Object原型对象,如下图:

再来看下Function原型对象,如下图:

最后看下a_a实例对象,如下图:

测试代码

红框框住的部分就是所谓的原型链,原型链中的方法,实例对象a_a都可以访问,JavaScript也是用原型链来实现继承的。

另外,还有一件有趣的事情,如下图:

无限递归

可以无限延展下去,是不是很有趣,有兴趣的同学可以试一下,可以加深你对这三个属性的理解,哈哈😄。

结语

关于怎么用原型和原型链来实现继承,网上有很多好的博文供大家参考,大家也可以参考以下链接,我在这里就不再废话了。本文如有错误,希望指正,不胜感激!

参考链接

https://segmentfault.com/a/1190000000662547
https://segmentfault.com/a/1190000003017751
http://blog.jobbole.com/9648/

上一篇 下一篇

猜你喜欢

热点阅读