博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript原型
阅读量:4046 次
发布时间:2019-05-25

本文共 1833 字,大约阅读时间需要 6 分钟。

2.对象原型

函数可以和以它为构造器所创建的所有对象共享原型对象。就比如本文最初展示的代码中,per01和per02都是Person函数创建的,那么per01或per02就可以通过自身的__proto__属性关联到Person对象的原型。

下图表示了它们之间的关系

 

所以既然函数的原型对象是可以为所有被创建对象共享的,那么就可以将我们要为所有对象都添加的属性添加到原型对象上。

       function Person(perName,perAge,gender){

              this.perName = perName;

              this.perAge = perAge;

              this.toString = function(){

                     return "PersonName="+this.perName+" PersonAge="+this.perAge;

              };

       }

      

       var per01 = new Person("Bob", 20);

       var per02 = new Person("Kate", 25);

      

       Person.prototype.message = "Atguig is very good";

      

       console.log(per01.toString()+" message="+per01.message);

       console.log(per02.toString()+" message="+per02.message);

 

执行结果:

PersonName=Bob PersonAge=20 message=Atguig is very good

PersonName=Kate PersonAge=25 message=Atguig is very good

 

JavaScript引擎在读取per01对象的message属性时先在当前对象本身的空间内查找,如果能找到则直接返回,如果找不到则沿着__proto__属性找到原型对象,再在原型对象中查找message属性。

 

三、原型链

在研究了对象原型和函数原型的关系后,我们还可以进一步深入思考:既然原型对象是一个“对象”,那么这个对象有没有__proto__这个属性呢?当然有!

     function Person(perName,perAge,gender){

            this.perName = perName;

            this.perAge = perAge;

            this.toString = function(){

                   return "PersonName="+this.perName+" PersonAge="+this.perAge;

            };

     }

    

     var person = new Person("Tom", 20, "male");

    

     console.log(person.__proto__);

     console.log(person.__proto__.__proto__);

 

执行结果:

Person {}

Object {}

说明person.__proto__所指向的对象是由Person函数创建的,而person.__proto__.__proto__所指向的对象是由Object函数创建的。

就对象的本质而言,任何一个对象都是以new 构造器函数的方式创建的,所以所有对象都和构造器函数共享原型对象。这样说可能你会有疑问,我可以通过{属性名:属性值}的方式创建对象呀,这里并没有用到构造器函数呀?那么情看下面的代码:

       var obj = {"myName":"Jerry","myAge":15};

       console.log(obj.constructor);

       console.log(obj.__proto__ === Object.prototype);

 

执行结果:

function Object()

true

说明从本质上来说,任何对象的创建都依赖对应的构造器函数,当然也包含原型机制。既然如此,那么原型对象本身也是一个对象,这个对象也指向一个原型对象,那么原型对象的原型对象也是对象,可以继续指向一个原型对象……这就是原型链。

但原型链并不是无止境的,到Object()函数为止。

       var obj = {"myName":"Jerry","myAge":15};

       console.log(obj.__proto__.__proto__);

 

 

执行结果:

null

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。

你可能感兴趣的文章
怎么写一个温泉管理系统
查看>>
令人神清气爽的shooow
查看>>
指导教师的shooow
查看>>
leetcode面试题01.06.字符串压缩,超出时间限制,样例通过31/32
查看>>
机器学习实战、第二章KNN算法详解、AttributeError: ‘dict‘ object has no attribute ‘iteritems‘
查看>>
leetcode 535 TinyURL 的加密与解密 暴力 年轻人不讲武德—shooter7的博客
查看>>
课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)
查看>>
leetcode1792第232场周赛第三题,以及二维数组根据某一列进行排序——优先队列
查看>>
学生网上选课管理系统的设计与实现—计算机类专业课程设计(毕业设计)
查看>>
新建动态web工程项目红叉报错,以及Could not publish server configuration for Tomcat v9.0 Server at localhost.
查看>>
机器学习SVM的车牌识别系统—计算机专业课程设计(毕业设计)
查看>>
leetcode 80. 删除有序数组中的重复项 II
查看>>
课程设计(毕业设计)—学生宿舍管理系统—计算机类专业
查看>>
毕业设计(课程设计)—SpringBoot网上订餐系统的设计与实现—计算机类专业课程设计(毕业设计)
查看>>
毕业设计(课程设计)—个人博客系统(微博)的设计与实现—计算机类专业课程设计(毕业设计)
查看>>
牛客(中兴捧月)—B-切绳子
查看>>
剑指Offer 13.机器人的运动范围——DFS和BFS
查看>>
Java中GUI编程总结—AWT中的Frame容器、panel面板、布局管理
查看>>
剑指offer12.矩阵中的路径—DFS+剪枝
查看>>
Java中GUI编程总结—事件监听、TextField监听、画笔、(鼠标、窗口、键盘)监听
查看>>