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>
复制代码
原文地址:https://www.cnblogs.com/fengxiongZz/p/7815473.html