JavaScript原型、原型链及继承
prototype原型
1.原型定义
每一个构造函数都有一个prototype属性,这个属性会在生成实例的时候,成为实例对象的原型对象。javascript的每个对象都继承另一个对象,后者称为“原型”(prototype)对象。
一方面,任何一个对象,都可以充当其他对象的原型;另一方面,由于原型对象也是对象,所以它也有自己的原型。null也可以充当原型,区别在于它没有自己的原型对象。
2.原型作用
1、通过原型来添加方法,解决数据共享,节省内存空间
2、作用于继承,模拟面向对象,来做到继承,多态
如下图:
实例对象的_prototype_指向构造函数的prototype属性,从而可以实现继承,而此时prototype原型对象相当于特定
类型的所有实例对象可以访问的容器。
原型链
1.原型链定义
每个对象都有一个__proto__属性,指向它的prototype原型对象,而该prototype原型对象又有它自己的prototype原型对象,依次层层往上查询直到prototype的原型对象为null,则该条查询路径为原型链。
“原型链”的作用是,读取对象的某个属性时,JavaScript 引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到,则返回undefined。
举例来说,如果让某个函数的prototype属性指向一个数组,就意味着该函数可以当作数组的构造函数,因为它生成的实例对象都可以通过prototype属性调用数组方法
继承
构造函数继承
本质是在子类中,调用父类构造函数,从而让子类拥有父类的属性和方法
call/apply继承
var MyArray = function () {
};//MyArray.prototype = new Array;
var mine = new MyArray();
mine.push(1, 2, 3);
mine.length//
上面代码中,mine是构造函数MyArray的实例对象,由于MyArray的prototype属性指向一个数组实例,使得mine可以调用数组方法(这些方法定义在数组实例的prototype对象上面)。
原型链继承就是利用这个原理
将一个构造函数的原型指向另一个构造函数的实例对象来实现继承。
function Box() { //Box构造
this.name = 'Lee';
}
function Desk() { //Desk构造
this.age = 100;
}
Desk.prototype = new Box(); //Desc继承了Box,通过原型,形成链条
var desk = new Desk();
alert(desk.age);
alert(desk.name); //得到被继承的属性
混合继承:
结合使用原型链与构造很熟继
function Box(age) {
this.name = 'Lee'
this.age = age;
}
Box.prototype.run = function () {
return this.name + this.age;
};
function Desk(age) {
Box.call(this, age); //构造函数继承继承了 name 和age 属性
}
Desk.prototype = new Box(); //原型链继承 run方法
var desk = new Desk(100);
alert(desk.run());