zoukankan      html  css  js  c++  java
  • javascript高级:原型与继承

    原型继承的本质就是一条原型链,对象会沿着这条链,访问链里的方法属性.

    对象的__proto__属性就是用于访问它的原型链的上一层:

    考虑以下对象:

    1. 所有对象的原型:

    Object.prototype

    2. 所有函数的原型:

    Function.ptototype

    3. 函数的构造函数:

    Function

    4. 对象的构造函数:

    Object

    5. 自定义的构造函数Person:

    function Person(){

         this.name=function(){};

         this.init=function(){alert('我是Person对象的方法')};

    }

    6. 自定义构造函数Person的原型Person.prototype:

    Person.prototype.init=function(){alert('我是Person原型的方法')}

    7. 通过Person实例化得到的对象person:

    var person = new Person();

    person.init=function(){alert('我是person私有的方法')}

    8. 通过Object实例化得到的对象object:

    var object = new Object();

    * 注意: var object = {},一样也是通过Object实例化得到的对象

    他们之间的继承关系如下:

    从最外层的开始看起,如果要访问person实例的某个方法属性,它寻找的顺序应该是这样的:

    完整代码:

    Object.prototype.init=function(){alert('我是对象的原型的方法')};

    function
    Person(){ this.name=function(){}; this.init=function(){alert('我是Person对象的方法')}; } Person.prototype.init=function(){alert('我是Person原型的方法')} var person = new Person(); person.init=function(){alert('我是person私有的方法')} var object = new Object();
    person.init();

    首先寻找person的私有方法:

    --也就是这里的person.init;

    如果找不到,会找到Person的对象的方法:

    --也就是这里的Person构造函数里的的this.init;

    如果再找不到,它就会到原型链里去找方法:

    person的原型链,就是person.__proto__,这里就是指向Person.prototype

    因为,顺着原型链,首先会找到Person原型的方法:

    --也就是这里的Person.prototype.init;

    如果再找不到,它会顺着原型链继续找,也就是Person.prototype.__proto__,就是指向Object.prototype

    --也就是这里的Object.prototype.init;

    如果再找不到,那么就没有了,因为Object.prototype.__proto__指向null

    所以,在js里,一切皆对象,因为所有的对象通过原型链,最后都会继承Object.prototype里的方法和属性,比如toString...等等...

    再来看Person构造函数,Function构造函数,Object构造函数:

    这三个都属于构造函数对象,通过他们可以new 一个对象,他们本身的__proto__都是Function.prototype,所以他们都继承了Function所有用的方法,比如bind(),apply()...等...

    同样,示例中虽然没有提到,但是相似的,所有的内置构造函数,他们的__proto__也都是Function.prototype:

    Boolean.__proto__ === Function.prototype // true
    String.__proto__ === Function.prototype  // true
    Object.__proto__ === Function.prototype  // true
    Function.__proto__ === Function.prototype // true
    Array.__proto__ === Function.prototype   // true
    RegExp.__proto__ === Function.prototype  // true
    Error.__proto__ === Function.prototype   // true
    Date.__proto__ === Function.prototype    // true
     
    Math对象和JSON对象,不是构造函数,他们的__prototype__是Object.prototype:
    Math.__proto__ === Object.prototype  // true
    JSON.__proto__ === Object.prototype  // true

    至于constructor,具体查阅上一篇文章:

    http://www.cnblogs.com/liulangmao/p/3467863.html

  • 相关阅读:
    org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied:
    linux iptables跟service 命令无效解决方法
    eclipse运行C++控制台不输出结果的解决办法
    C#操作mpp文件代码参考
    vs2010 开始执行(不调试) ctrl F5 出现任意键继续
    关于gcc、glibc和binutils模块之间的关系,以及在现有系统上如何升级的总结
    NUnit在Visual Studio 2010中的配置和使用
    【转】从CSDN的趣味题学C# 3.0
    gnome3程序图标下的文字如何改大
    使用autoconf、automake等来制作一个以源代码形式(.tar.gz)发布的软件、并可在执行configure时使用自定义参数
  • 原文地址:https://www.cnblogs.com/liulangmao/p/3474270.html
Copyright © 2011-2022 走看看