• 关于js中原型链的理解


         我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,一个对象。无论什么时候,我们只要创建一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性对象指向函数的原型对象。在默认情况下,所有原型对象都会自动获得一个 constroctor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。例如:

          

    function Person(){}
    

        当我们创建这个Person函数(对象)的时候,该函数便有了一个prototype属性,它的原型对象Person.prototype会获得一个constroctor属性,那么Person.prototype.constroctor便指向了Person。更直白一点讲就是,如果我们再此基础上再加一句

    var p=new Preson();
    

      那么,p的原型就会指向构造器的prototype属性,也就是Person.prototype。

        那么,原型链具体的工作机制是什么?请看下面这个例子

    function foo(){}
    foo.prototype.z=3;
    
    var obj=new foo();
    obj.y=2;
    obj.x=1;
    
    obj.x;//1
    obj.y;//2
    obj.z;//3
    
    typeof obj.toString();//'function'
    'z' in obj;//true
    obj.hasOwnProperty('z');//false

         

      当输出obj.z的时候,并不会因为obj对象没有z属性而输出undefied,而是查找obj的原型也就是foo.prototype,这是js发现z的值是3,所以就会输出obj.z的值为3.

     实际上,我们用对象字面量创建的函数对象,其原型obj.prototype会指向Object.prototype,而Object.prototype也是由原型的,其值是null,这是上就是一个

     原型链,而这也是  typeof obj.toString(); 为function的原因,因为沿着原型链向上查找,便找到了object中的toString方法。

         

  • 相关阅读:
    latch与DFF
    数字逻辑综合DC脚本示例及解释
    当DiscuzNT遇上了Loadrunner(下)
    [C#学习]在多线程中如何调用Winform
    并发性测试工具
    当DiscuzNT遇上了Loadrunner(上)
    大型网站(高访问、海量数据)技术架构
    Load Runner下载
    Invoke 和 BeginInvoke 的真正涵义
    当DiscuzNT遇上了Loadrunner(中)
  • 原文地址:https://www.cnblogs.com/qqqiangqiang/p/5161192.html
Copyright © 2020-2023  润新知