原型链的继承就是将子类的prototype.__proto__
链接到父类的prototype
,借此完成原型链
child.prototype.__proto__.= parent.prototype
实例化的对象没有prototype
,prototype
是函数特有的属性,所有的对象都有__proto__
, 这是指向实例化这个对象的类的prototype
,所有对象的原型链最后是null
下面是经典的原型链继承的例子,我借此解释一下
function extend(Child, Parent) {
var F = function(){};
//将父类的prototype复制到F函数中
F.prototype = Parent.prototype;
/*new F()实例化F()实际的作用是生成了一个下面这个对象
{
__proto__: {
//Parent.prototype
}
}
这样就完成了
Child.prototype.__proto__ = Parent.prototype这个原型链继承的核心内容
*/
Child.prototype = new F();
//Parent.prototype的constructor是Parent,为了准确这里要手动将Child.prototype.constructor改为Child
Child.prototype.constructor = Child;
//这里是为了代码实际开发时方便调用父类,不用使用__proto__
Child.uber = Parent.prototype;
}
涉及到继承这一块,Javascript 只有一种结构,那就是:对象。在 javaScript 中,每个对象都有一个指向它的原型(prototype)对象的内部链接。这个原型对象又有自己的原型,直到某个对象的原型为 null 为止(也就是不再有原型指向),组成这条链的最后一环。这种一级一级的链结构就称为原型链(prototype chain)。---MDN原型链描述
上面这句话有些长,看代码获取会直观一点
childClass.prototype.__proto__ == parantClass.prototype
childInstance.__proto__ == childClass.prototype
childInstance.__proto__.__proto__ == childClass.prototype.__proto__ == parantClass.prototype
对于这里的childInstance.__proto__ == childClass.prototype
,是由关键字new
实现的,具体可以看我的另外一篇文章new到底做了什么
网友评论