1.约定
function Person(){
var name="zs"//私有的基本属性
var friend =["ls","ww"]//私有的引用属性
function f1(){}//私有的函数
}
function Person(){
this.name="zs"//实例的基本属性
this.friend =["ls","ww"]//实例的引用属性
this.f1=function(){}//实例的函数
}
2.原型链继承
创建一个对象,Animal,构造函数+原型
name 引用类型 方法 say eat
function Animal(){
this.name="animal"
this.friends=['wb','b']
this.say=function(){
console.log("say...");
}
}
Animal.prototype.eat=function(){ console.log("eat..."); }
function Cat(){
Cat.prototype=new Animal()
var c1=new Cat()
c1.name
c1.say()
}
总结:
核心: Cat.prototype=new Animal()拿父类实例充当子类原型对象
原型链的查找顺序,先在实例内查找,找实力对象的构造函数,找实例对象的原型,父类的构造函数,找父类的原型
优点:简单易于实现,
缺点:原型的引用类型属性是所有实例共享的,
创建子实例无法想父类构造函数传参
3.原型链的原理
(1)每个函数都有一个显示的“prototype”属性,该属性指向原型对象
(2)圆形对象中的“
(3)new创建的对象没有原型属性,
(4)每个对象都有一个__proto__内部属性,指向它所对应的原型对象
(5)原型链利用原型上一个引用类型继承另一个引用类型的属性方法
核心:原型链正是基于__proto__才得以形成
(6)当原型属性只想空的时候就是圆形的继承hh
4.构造函数的继承
总结:
核心:借用父类的构造函数,来增强子类的实例,完全没用到的原型,
优点:1.解决了子类实例共享父类引用属性的问题
2.创建子类时可以向父类构造函数传参
缺点;无法实现函数的父用,每个子类实例都有一个新的function函数,消耗内存
5.组合继承(构造函数+原型链)
总结:
核心:把实力函数都放在原型对象上,以实现函数父用,并保留构造函数
优点:不存在调用属性共享问题
可传参
函数可复用
缺点:因为父类构造函数被调用两次,生成两份浪费内存
6.原型式继承
function Animal(obj){
function F(){}
F.prototype=obj
return new F()
}
var Person={name:"zs",friends:["ls","ww"]}
var p1=Animal(Person)
核心:用生孩子函数,得到一个纯洁的("没有实例属性的对象")e