js 原型及继承的一点理解
2016-05-12 本文已影响220人
debt
类式继承
- 一个构造函数对应一个原型,原型相当于他的影子,这个影子里也可以添加属性、方法。
- 最常见的继承方法
Sub.prototype=new Super();
理解下就是将父类的一个实例对象传给子类的原型。 这里注意理解是new了一个父类对象实例,这个实例包含两部分内容
- 构造函数里面的属性方法
- 原型对象里的属性方法
b=new Sub()
首先生成一个实例对象b 这个b首先包括自身构造函数里面的属性方法,还包括原型对象里的属性方法,它的原型是啥子哦?上面说了是父类的一个实例,里面东西很全,所以啊,子类就是继承的这个父类的实例对象
这样有两个不好的方面
- 如果实例了两个子类b和c ,而父类中有一个数组,这时如果在
b.arr.push("c")
这时就会改变他们那个父类实例对象。这里多说两句,明天记得补充 - 这样继承好像不能传参
构造函数继承
这个主要是理解call ;晚上大概理解了,Super.call(this,data);
这句话是说把data置入Super的构造函数中运行 不过这时的this
指向的是Sub; 这样做的好处当然是可以传参,不过不能继承父类原型中的属性方法
原型式继承
function inherit(o){
function F(){}
F.prototype=o;
return new F();
}
这里的o为父类对象(注意这里是一个对象,并不是构造函数),然后上面这段代码其实是对类式继承的一种封装(也不完全准确,如果是原型类继承的话应该是F.prototype=new o()
) 这里是直接将一个对象赋给了F 。 所以啊,这个也不能避免类式继承的第一个问题,就是subOne.friend.push("d")后 person.friend的结果就是abcd;
var person={
name:"ljd",
friend:["a","b","c"]
}
var subOne=inherit(person);
var subTwo=inherit(person);
ECMAScript中Object.create()方法和inherit是一样样的。