js原型及原型链。

js原型

JavaScript规定,每个函数有一个prototype对象属性,指向另一个对象(原型链上面的)。
prototype(对象属性)的所有属性和方法,都会被构造函数的实例继承。这意味着,我们可以把哪些不变(公用)的属性和方法,直接定义在prototype对象属性上。prototype就是调用构造函数所创建的那个实例对象的原型(proto)。
prototype可以让所有对象实例共享它所包含的属性和方法。也就是说,不必构造函数中定义对象信息,而是可以直接将这些信息添加到原型中。

// es5方法
    // 通过函数创建类
    function Person(name, age) {
      // 对象属性
       this.name = name;
       this.age = age
     }
   // 对象方法
    Person.prototype = {
       showName() {
        return '我的名字叫:' + this.name
       },
       showAge() {
        return '我的今年:' + this.age
      }
   }
  // 实例化对象
   let person = new Person('齐天大圣1', 18)
  // 调用对象的方法
   console.log(person.showName())
   console.log(person.showAge())
   /
   //es6方法
    class point{
    // 它是一函数,它的名字是固定的:constructor(构造器)
    //在new 实例时,它会被自动调用,并传入实参
    //一个class必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加
      constructor(name,age){
        this.name=name ;
        this.age=age;
      }
      // 以下是构造函数原型上的方法
      showName() {
        return '我的名字叫:' + this.name
       }
       showAge() {
        return '我的今年:' + this.age
      }
      
    }
    // new 方法创建新对象
    let p=new point("齐天大圣2",18)

    console.log(p.showName())
    console.log(p.showAge())


js原型链

每个对象都可以有一个原型_proto_,这个原型还可以有它自己的原型,以此类推,形成一个原型链。
查找特定属性的时候,我们先去这个对象里去找,如果没有就去它原型对象里去,如果还是没有的话再去向原型对象的原型对象里去寻找…这个操作被委托在原型链上,这就是我们说的原型链了。

//js 原型链实现类的继承
    //es5方法
    //父类
    function father(name) {
      // 对象属性 
        this.name = name; 
    }
     //父类的原型方法
     father.prototype.getName=function(name){
      return '我的名字叫:' + this.name;
     }
     //子类
  
     function Child(name){
       father.call(this,name)
     }
    Child.prototype=new father();
    
    var z = new Child("齐天大圣3");
    console.log(z.getName(name));
    // 让子类的原型对象指向父类实例, 
    //这样一来在Child实例中找不到的属性和方法就会到原型对象(父类实例)上寻找

    // 根据原型链的规则,顺便绑定一下constructor,
    // 这一步不影响继承, 只是在用到constructor时会需要
    /
    //es6
    class point2{ 
      constructor(name,age){
        this.name=name ;
        this.age=age;
      }  
    }
    class sexpoint2 extends point2{
      constructor(name,age,sex){
        // 在子类型构造函数中通过super调用父类型的构造函数
        super(name,age);
        this.sex=sex
      }
      toSex(){
        return "名字:"+this.name+" 年龄:"+this.age+" 性别:"+this.sex
      }
    }
    let sext=new sexpoint2("齐天大圣4",18,"男")
    console.log(sext.toSex());  
    console.log(sext.name);
    console.log(sext.age);
    console.log(sext.sex)

原型指针

prototype属性,他是函数独有的,它从一个函数指向一个对象。他的含义是函数的原型对象,也就是这个函数所创建的实例的原型对象;
这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象);
_proto_是原型链查询中实际用到的,他总是指向prototype,话句话说就是指向构造函数的原型对象,它是对象独有的。

总结

1,_proto_是原型链查询中实际用到的,他总是指向prototype;
2,prototype 是函数所独有的,在定义构造函数时自动创建,它总是被 proto 所指。
3,所有对象都有__proto__属性,函数这个特殊对象除了具有__proto__属性, 还有特有的原型属性prototype。
4,prototype对象默认有两个属性,constructor属性和__proto__属性。
5, prototype属性可以给函数和对象添加可共享(继承)的方法、属性。
6,__proto__是查找某函数或对象的原型链方式。
7,constructor,这个属性包含了一个指针, 指回原构造函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值