javascript 原型链YY:共享角度解析

javascript原型图片如下:是从其它地方考过来的



 

 

 

 上面的图片看起来很复杂,但是还是简单的,理解思路如下:

 1. 假设什么都没有,全部空白

 

 2. 类似java,通过 new Xxx 来创建对象 (Xxx 假设叫 Function)

 

 3. 接受一个语法,function Function 可以申明"类",(看过scala其实也不难想象,所以下面的类都是加""的理解,不同于java)

    (js通过自己的语法,通过function来new 对象)

     或者想象这是你自己的语言,function Function 会主动在内存开辟空间,保存属性和方法

     ps: function Function 和 new Function()是不一样的,不要混杂

    3.1 想象 function Function 其实也是一个对象,即内部创建了 { }.Function

         { }里面有很多的内部属性和方法 ,此文称这个对象为   innerFunc1

 

 4. 除了Function类,还有其它许多类,比如Foo, 则 new Foo(..)  (innerFunc2)

     除了Foo还有其它很多类,那么不断的new:

     出现问题:这些类没有交互,比如 共享一些属性和方法

     4.1 :于是从innerFunc1开始,抽离出一些公共的属性和方法(Function.prototype)

              Foo通过__proto__ 引用这些共享的属性和方法

     4.2 如此循环,Foo 自己也把innerFun2中的部分属性和方法共享出去 (Foo.prototype)

 

>>>>>>>>>>>>>>>>>>>>

5. 至此,原先从无到现在,已经形成了一幅图画,如下:(后期补)

 

6. 疑惑解答:目前为止形成的类体系和javascript本身的体系相比,尚缺如下元素:

    6.1 Function.__proto__ 到共享之间的链条

    6.2 尚未出现new Object()

    6.3 Function.prototype.__proto__ 到Object.prototype 的链条

 

   6.1解答:

    Function.prototype本身就是从innerFunc1中分离出去的共享属性和方法,

    Function.__proto__指向这些属性和方法,并没有不妥.

    这里的核心就是: function Function 声明的时候,js内核其实开辟了内存空间 { },暂时成为innerFunc1

   6.1.1 想象原始 每个 function 声明都会创建innerFunc, prototype的出现是为了 对这些 innerFunc进行公共属性和方法的抽象 

 

   6.2解答:

   至此,发现所有的prototype都是相互独立,后来逐渐发现,这些prototype也可以抽离出一些共享属性和方法。于是就出现了 function Object .

   function Object 本身共享了 function Function对象的属性和方法

                          <= Object.__proto__ = Function.prototype

   而function Object共享的属性和方法(Object.prototype) 是作为 所有 innerFunc.prototype 共享属性和方法

    的存在, 所以 function Object 是一个特别的 function 对象而已

 

   6.3解答:

     见6.2 Function.prototype__proto__ 因为 Object.prototype是作为 所有prototype的共享而存在的

 

 最后 做如下的题目 ,应该是十分简单的了

 function Foo() {};

var foo = new Foo();

 

alert(foo instanceof Foo); // ?

alert(foo instanceof Object); // ?

alert(foo instanceof Function); // ?

alert(Foo instanceof Function); // ?

alert(Foo instanceof Object); // ?

 

    

   

 

     

     

 

    

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值