js 对象方法(实例方法) 类方法 原型方法

js 对象方法(实例方法) 类方法 原型方法

function Animal() {
      //实例属性
      this.name = name || 'Animal';
      //实例方法
      this.sleep = function () {
        console.log(this.name + "正在睡觉")
      }
      this.play=function(play){
        console.log(this.name+'正在玩'+ play)
      }
    }
     //类方法
    Animal.eat = function (food) {
      console.log(food)
    }
    //原型方法
    Animal.prototype.play = function (play) {
      console.log(play)
    }

    //test1 类调用方法
    Animal.eat('food')//food 能够调用类方法
    console.log(Animal.name)//Animal 能够调用实例属性
    Animal.play('warter') //not a function 不能调用原型方法
     Animal.sleep()//not a function 不能调用实例方法

    //test2 new实例化后调用方法
    let Cat = new Animal();
    console.log(Cat.name) //Animal 能够调用实例属性
    Cat.play('warter') //能够调用原型方法(实例方法会覆盖原型方法 优先级高于原型)
    Cat.sleep() //能够调用实例方法
    Cat.eat('food') //不能够调用类方法

自我总结:javascript

  1. 写在原型中的方法能够被全部的实例共享, 实例化的时候不会在实例内存中再复制一份,占有的内存消耗少。
  2. js中每一个函数都有一个prototype属性,这个属性指向一个对象(全部属性的集合:默认constructor属性,值指向这个函数自己。)
  3. 每一个原型对象都属于对象,因此它也有本身的原型,而它本身的原型对象又有本身的原型,因此就造成了原型链。
  4. 一个对象的隐式原型指向构造这个对象的构造函数的显式原型,因此这个对象能够访问构造函数的属性和方法。(new一个实例)
  5. js的继承也就是经过原型链来实现的,当访问一个对象的属性,若是这个对象自己不存在,则沿着__proto__依次往上查找,若是有则返回值,没有则一直到查到Object.prototype的__proto__的值为null.

console.log(Cat.proto.proto.proto)//null
Cat.__proto__等于Animal.prototype ,
Animal.prototype.__proto__等于Object.prototype.java