js原型,原型链,call和apply

原型

在这里插入图片描述

    function  Person(){
             //var this={__proto__:Person.prototype}
           }
           Person.prototype.name="sunny";
           var person=new  Person();
           Person.prototype={
             name:"cherry"
           }
           console.log(person.name);

这段代码因为先创建了对象,所以后期直接改变原型对其没有影响。输出sunny。若将new放在后面,则输出cherry.

Test.prototype.name="laowang";
         function Test(){
           this.name="renjialei";
                         }
         var  test=new Test();
         var  person=Object.create(Test.prototype);
         console.log(person.name); 

这段函数用了一个方法叫做 Object.create(Test.prototype),该方法里面需要添加对象的原型。

  Object.prototype.toString=function(){
            return "haha";
          }
          Person.prototype={
               
          }
          function Person(){
        
          }
          var person=new Person();
          console.log(person.toString());

方法的重写,用tostring方法返回值是根据终端原型来划分的。可以在中间进行重写。

原型链

原型链是作为实现继承的主要方法,基本思想是利用原型让一个引用类型去继承另一个引用类型的属性和方法。如果将一个对象的原型指向了一个实例,实例中的所有属性和方法都将会继承在原型对象中。

            function Person(){}    //构造函数创建的过程第一步 var this={this.__proto__=Person.prototype}
            function Person1(){} 
          Person1.prototype.name="zhangsan";
           var person=new Person();
           var person1=new Person1();
           person.__proto__=person1;     //person.__proto__===Person.prototype
           console.log(person.name);      

观察这段函数,可以将person1理解为this,所以通过__proto__属性将person1的原型赋给了person,如果person里面没有name属性,将会去person1里面寻找,然后进入person1的原型里面寻找。所以最后结果是zhangsan.

            function Person(){
                 }
            function Person1(){
                       }
            Person1.prototype.name="zhangsan";
            Person.prototype=new  Person1();
           var person=new Person();
           console.log(person.name);

这段代码和上面的用法一样的,但印证了实例中的属性和方法将会成为新指向他的原型的方法和属性,而实例的原型将会成指向他的原型的原型。

原型中有一种神奇的方法,它只会在实例中寻找属性,而不会去原型中搜索。这个方法叫做hasOwnProperty(),他的返回值是true和false.

var person = {
            name: "renjialei",
            age: 18
        }
        person.__proto__.sex = "man";
        console.log(person.hasOwnProperty("name"));  //true

call和apply

作用:改变this的指向
区别:后面传递参数的形式不同。

 function Sub(name){
            this.name=name;
          }
          function Sup(){
            this.age=18;
            Sub.call(this,"renjialei");
          }
         var  sup=new Sup();
         console.log(sup.name);

这段函数里面使用了call()方法,其中第一个是需传递的对象,后面是传递的参数。普通方法的调用比如sub(),其实系统在后台会这样调用sub call(),里面没有对象,所以是默认值。至于apply,在传递参数时,需要以数组的形式传递,并且只能有一个数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值