zoukankan      html  css  js  c++  java
  • 夺命雷公狗---javascript NO:28 原型链

    1、原型对象

    在JavaScript中,每个构造器在加载后都会自动生成一个对象,我们把这个对象就称之为原型对象。

    2、构造器与原型对象的关系

    Person构造器与Person原型对象在内存中表现为相互独立,互不影响。但是在Person构造器中存在一个prototype属性指向Person原型对象,同时在Person原型对象中也存在一个属性指向Person构造器。

    3、原型对象的作用

    当我们在Person构造器的实例对象中引用一个不存在的属性或方法,系统会自动到Person构造器的原型对象中去寻找该属性。

    4、如何证明prototype与constructor属性是互相指向关系

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset=’utf-8′>
    <title></title>
    </head>
    <body>
    <script>
    //定义一个Preson构造器
    function Preson(){}
    //通过person构造器实例化p1对象
    var p1 = new Preson();
    alert(p1.constructor.prototype.constructor.prototype.constructor);
    </script>
    </body>
    </html>

    5、原型对象的实际应用

    在实际项目开发中,我们经常会使用别人编写的一些现成的框架或对象,如果我们发现其不存在某些属性,那么如何解决呢?

    答:可以使用原型对象扩展属性

    1)为原型对象添加属性

    示例代码:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset=’utf-8′>
    <title></title>
    </head>
    <body>
    <script>
    //定义一个Preson构造器
    function Preson(){}
    //通过person构造器实例化p1对象
    var p1 = new Preson();
    p1.name = ‘lisi';
    p1.age = 22;
    Preson.prototype.email = ‘123@qq.com';
    alert(p1.email);  //p1对象访问了一个不存在的email属性
    </script>
    </body>
    </html>

    2)为原型对象添加成员方法

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset=’utf-8′>
    <title></title>
    </head>
    <body>
    <script>
    //定义一个Preson构造器
    function Person(){}
    //通过person构造器实例化p1对象
    var p1 = new Person();
    p1.name = ‘lisi';
    p1.age = 22;
    //为Person原型对象定义speak成员方法
    Person.prototype.speak = function(){
    alert(this.name+’—-‘+this.age);
    }
    p1.speak();  //调用p1对象的不存在的speak成员方法
    </script>
    </body>
    </html>

    6、探究原型对象从何而来

    原型对象在创建过程中,会自动执行以下代码:

    构造器.prototype = new Object();

    说明:当我们通过Person构造器的实例化对象p1访问一个不存在的属性或方法时,系统会自动到Person构造器的原型对象中去寻找,又由于所有的原型对象都是Object类的实例,原型对象会自动继承Object类中的所有属性和方法,我们可以得出结论:

    p1对象会自动继承Object构造器中的所有属性和方法。

    p1.属性à原型对象.属性 = new Object();所以可以得出

    p1对象会自动继承Object构造器中的所有属性和方法。

    我们把这种继承关系就称之为:原型继承

    证明:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset=’utf-8′>
    <title></title>
    </head>
    <body>
    <script>
    //定义一个Preson构造器
    function Person(){}
    //通过person构造器实例化p1对象
    var p1 = new Person();
    p1.name = ‘lisi';
    p1.age = 22;
    alert(p1.hasOwnProperty(‘name’));
    </script>
    </body>
    </html>

    7、原型链

    当我们访问一个不存在的属性或方法时,系统会向上一级构造器的原型对象中去寻找,如找不到,则继续向上一级原型对象中去寻找,我们把这种链式查询关系,就称之为原型链。

    证明:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset=’utf-8′>
    <title></title>
    </head>
    <body>
    <script>
    //定义一个Preson构造器
    function Person(){}
    //通过person构造器实例化p1对象
    var p1 = new Person();
    p1.name = ‘lisi';
    //为person原型对象定义一个age属性
    Person.prototype.age = 23;
    //为obj原型对象定义一个email属性
    Object.prototype.email = ‘123@qq.com';
    alert(p1.age);
    alert(p1.email);
    </script>
    </body>
    </html>
  • 相关阅读:
    Web应用指纹识别
    同步I/O 和 异步I/O
    怎样找出自己定义标签的java类
    Android多线程文件下载器
    cocos2d-x 3.0游戏实例学习笔记 《跑酷》 第三步---主角开跑&amp;同一时候带着刚体
    记C++课程设计--学生信息管理系统
    iOS开发--从TQRichTextViewDemo中学会分析project
    九度oj题目&amp;吉大考研10年机试题全解
    setOnFocusChangeListener的使用
    查看网络port占用
  • 原文地址:https://www.cnblogs.com/leigood/p/5032011.html
Copyright © 2011-2022 走看看