美文网首页
JavaScript小进阶9--一张图看尽原型及底层模拟

JavaScript小进阶9--一张图看尽原型及底层模拟

作者: _Danniel_ | 来源:发表于2018-06-26 10:27 被阅读0次

一张图就可以看尽js的原型:注意红色箭头,就是js的原型链!!

    由上面,两个注意:

    1.       console.log(X.prototype.__proto__);// 一个Object对象:{}

              console.log(X.prototype.__proto__.__proto__);//null

                    __proto__是每个对象都具有的属性(在W3C标准的浏览器中,我们才可以直接访问);prototype是每个function对象都具有的属性;然而,constructor确是原型对象而非普通实例对象具有的属性,系统自动为原型对象预添加的。

问题1:原型对象是怎么来的?什么是原型的继承??

答:其实,在系统载入定义的(任何函数)function  Person时,会同时执行:Person.prototype = new Object();  Person.prototype.constructor = Person; 两者的关系的建立是系统底层自动完成的。因此原型对象Person.prototype的所有初始属性都是从Object中继承而来,而Person类的实例对象的初始属性再继承自原型对象,即也是从Object中继承而来,此乃原型继承。是故,可以理解为:Object类是所有类的父类。

        如下一个例子:

        Object.prototype.appleCount = 1000;//所有实例对象都会具有appCount属性!!!

        console.log(p1.appleCount);//打印:1000

问题2:当实例对象和其原型具有部分同名属性时,js引擎会如何选择?

当实例对象和其原型具有部分同名属性时的一种情况:

        var base = {

          name : "base",

          getName : function(){

            console.log(this.name);//会打印

          }

        }

        var p1 = {

          name : "p1",

        }

        p1.__proto__ = base;

        p1.getName();//!!!!打印出p1

        这里有点类似于java中的:覆盖!!!可以理解为:父类的引用指向子类的对象!!


js对象产生对象的底层模拟(纯属意淫):

       //首先我们有一个Person函数:

      function Person(){this.name = "luozhixiao";}

        //1)当加载函数Person时,创建Person函数对象,然后执行:

        Person.prototype = {};

        Person.prototype.constructor = Person;

        //2)当我们执行:new Person() 创建类对象时,底层实现模拟如下:

        var __Person_Obj__ = {};

        __Person_Obj__.__proto__ = Person.prototype;//这里是重点!

        Person.apply(__Person_Obj__);

相关文章

网友评论

      本文标题:JavaScript小进阶9--一张图看尽原型及底层模拟

      本文链接:https://www.haomeiwen.com/subject/dxepyftx.html