zoukankan      html  css  js  c++  java
  • JavaScript中的原型和原型链

    1、原型是什么?原型链是什么?

    原型是一个prototype对象,用于表示类型之间的关系;

    原型链指的是在JavaScript中对象之间的继承是通过prototype对象指向父类对象,直到指向Object对象为止,这样就形成了一个原型指向的链条,专业术语称之为原型链。

    举例:

    Student——>Person——>Object:学生继承人这个类,人这个类继承对象类;

    复制代码
    <span style="font-size:14px;">
    var Person=function(){
    this.age="匿名"
    }; var Student=function(){}; //创建继承关系,prototype执行Person的一个实例对象 Student.prototype=new Person();
    </span>
    复制代码

    五条原型规则:

    1、所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(除了“null”以外);

    2、所有的引用类型都有一个_proto_属性,叫隐式原型,属性值是一个普通的对象;

    3、所有的函数,都有一个prototype属性,叫显式原型,属性值是一个普通的对象;

    4、所有的引用类型的_proto_属性,指向它的构造函数的prototype属性值;

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script>
                //所有的引用类型都具有对象属性
                var obj = {};
                obj.a = 100;
                var arr = [];
                arr.a = 100;
                function fn(){}
                fn.a = 100;
                
                //所有的引用类型都有一个隐式原型
                console.log(obj.__proto__);
                console.log(arr.__proto__);
                console.log(fn.__proto__);
                
                //所有的函数都有一个prototype属性
                console.log(fn.prototype);
                
                //所有的引用类型,__proto__属性值指向它的构造函数的“prototype”属性值
                console.log(obj.__proto__ === Object.prototype);
            </script>
        </head>
        <body>
            
        </body>
    </html>

    5、当试图得到一个对象的某个属性时,如果没有,会向它的_proto_中寻找,即去它的构造函数的prototype中寻找。

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>
            <script>
                //构造函数
                function Foo(name,age){
                    this.name = name;
                }
                Foo.prototype.alerName = function(){
                    alert(this.name);
                }
                //创建实例
                var f = new Foo('zhangsan');
                f.printName = function(){
                    console.log(this.name);
                }
                //测试
                f.printName();
                f.alerName();
            </script>
        </head>
        <body>
            
        </body>
    </html>

    再次举例:

    Dog类继承了Animal类,随即拥有的Animal的eat方法(非常low的一个例子)

    复制代码
    <script type="text/javascript">
            function Animal() {
                this.eat = function () {
                    console.log("animal eat");
                }
            }
    
            function Dog() {
                this.bark = function () {
                    console.log("dog bark")
                }
            }
    
            Dog.prototype = new Animal();
            var hashiqi = new Dog();
            hashiqi.eat();    //animal eat
            hashiqi.bark();   //dog bark
        </script>
    复制代码

    接近实战的例子(一个封装DOM查询的例子): 

    复制代码
    //一定要非常注意JavaScript的位置
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8">
            <title></title>        
        </head>
        <body>
            <div id="box">
                <span>测试原型继承封装原生JavaScript</span>
            </div>
        </body>
        <script>
            function Elem(id){
                this.elem = document.getElementById(id);
            }
            Elem.prototype.html = function(val){
                var elem = this.elem;
                if(val){
                    elem.innerHTML = val;
                    //链式操作
                    return this;
                }else{
                    return elem.innerHTML;
                }
            }
            Elem.prototype.on = function(type,fn){
                var elem = this.elem;
                elem.addEventListener(type,fn);
                return this;
            }
            var div1 = new Elem('box');
            div1.html('<p>hello imooc</p>').on('click',function(){
                alert('clicked');
            }).html('<p>javascript</p>');
        </script>
    </html>
    复制代码
  • 相关阅读:
    mysql远程登录
    Linux下FTP服务器配置与管理
    linux编程的相对路径问题解决
    ERROR 1935_WIN7注册表大小的限制
    linux下jdk,tomcat的安装和配置
    使用Validator.validateAll验证Form
    mysql常用命令集合
    B or D
    Delphi开发日志系列文章的示例源码
    delphi开发日志——主窗体,程序管家
  • 原文地址:https://www.cnblogs.com/fengxiongZz/p/7815473.html
Copyright © 2011-2022 走看看