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') //不可以调用类方法
自我总结:
- 写在原型中的方法可以被所有的实例共享, 实例化的时候不会在实例内存中再复制一份,占有的内存消耗少。
- js中每个函数都有一个prototype属性,这个属性指向一个对象(所有属性的集合:默认constructor属性,值指向这个函数本身。)
- 每个原型对象都属于对象,所以它也有自己的原型,而它自己的原型对象又有自己的原型,所以就形成了原型链。
- 一个对象的隐式原型指向构造这个对象的构造函数的显式原型,所以这个对象可以访问构造函数的属性和方法。(new一个实例)
- js的继承也就是通过原型链来实现的,当访问一个对象的属性,如果这个对象本身不存在,则沿着__proto__依次往上查找,如果有则返回值,没有则一直到查到Object.prototype的__proto__的值为null.
console.log(Cat.proto.proto.proto)//null
Cat.__proto__等于Animal.prototype ,
Animal.prototype.__proto__等于Object.prototype.