• Javascript 原型链


      写这篇文章基于自己多年的研究(嘿嘿,开个玩笑) 

      本文属于翻译,但是是按照自己理解的意思翻译的 ,原文链接:http://www.mollypages.org/misc/js.mp

      

      1.所有实例也就是对象 继承于 创建他们函数的 原型对象;

        反映在js 代码中形如下: 

        function foo(){

        }

        var obj = new foo();

        obj 继承于 foo.prototype ;

        foo.prototype.x= 21;

        console.log(obj.x);

        输出结果: 21;

      2.不管存在/不存在 __proto__ 属性 ,一般的建议是所有的对象使用原型对象指向创建该对象的函数,这个属性成为javascript标准的一部分被称为 prototype(原型) 。原型对象,一般情况下有一个构造函数属性重新指向回这个原型的函数 ;

          so 你可以理解为 :

          function foo(){} 

          var obj = new foo();

          obj.prototype = foo; 

          foo.prototype.constructor = foo ; //原型重新指向 函数本身; 

      

      

    3.原型只用于 通过函数创建出来的对象/实例 属性继承,这个函数本身不会和原型关联(但是 一旦这个函数自己是一个对象了,它将继承至创建它的函数原形,典型的是 javascript 系统的“Function” 对象);
     
     
    //只能说类似,不能等同
    var bar = new Foo(); <==> var bar ={}; Foo.call(bar); 
     
    function Foo(){};
    var f1 = new Foo();
     
    Foo.prototype.x = "hello";
    console.log(f1.x);
    console.log(Foo.x);
     
    注解:我们使用 Foo.prototype 来为所有 通过函数Foo 创建出的对象 设置属性 我们不会说 用f1.prototype 来为f1设置属性 ,这是非常重要的一点,需要记住哦;
     
     
    4.默认 原型 对象可以被用户创建的对象替换,虽然如此,但是构造函数属性必须手动的去复制 ,因为javascript 运行时 会晚于 默认的原型对象 
     
    5.默认下原型 对象本身是通过构造函数 Object() 创建的 ,因此原型的原型是Object.prototype ,所以所有的实例/对象 不管类型 最终继承属性从 Object.prototype;
     
    6.所有的对象自动的读取属性在原型链 犹如 那些属性定义在自己的对象中

      

    Setting the same property via the object shadows/hides the same property in the prototype for that instance.

    function foo() { } 
    f1 = new foo();
    f2 = new foo();
    foo.prototype.x = "hello";
    
    f1.x  => "hello"
    f2.x  => "hello";
    
    f1.x = "goodbye";   //设置 f1.x 隐藏 foo.prototype.x
    
    f1.x  => "goodbye"  //只会对 f1 隐藏 "hello"
    f2.x  => "hello"    
      
    delete f1.x          
    f1.x  => "hello";   //foo.prototype.x 又重新对 f1 是可见的.
    

    Setting the property directly in the prototype changes it for all instances.

    foo.prototype.x = "goodbye";
    //now
    f1.x  => "goodbye"
    f2.x  => "goodbye";
  • 相关阅读:
    【转】P2P通信原理与实现(C++)
    【转】P2P通信标准协议(二)之TURN
    【转】P2P之UDP穿透NAT的原理与实现
    【转】P2P的原理和常见的实现方式
    【转】linux中man使用技巧
    【转】go编译时,加入svn版本信息
    各种移动GPU压缩纹理的使用方法
    Unity贴图压缩格式设置
    关于U3D贴图格式压缩
    可能会导致.NET内存泄露的8种行为
  • 原文地址:https://www.cnblogs.com/rosesBlogs/p/4449140.html
Copyright © 2020-2023  润新知