// 经典继承
// 创建Animal对象
function Animal(name) {
this.categorys = ["cat", "rabbit"];
this.name = name;
}
// 创建Dog对象
function Dog() {
// 继承 Animal
// 经典继承函数的一个优点就是可以在子类构造函数中向父类构造函数传参。
Animal.call(this,'zhangsan');
this.age = 12;
}
// 在var d1 = new Dog()时,是d1调用Dog构造函数,所以其内部this的值指向的是d1,所以Animal.call(this)就相当于Animal.call(d1),就相当于d1.Animal()。最后,d1去调用Animal方法时,Animal内部的this指向就指向了d1。那么Animal内部this上的所有属性和方法,都被拷贝到了d1上。所以,每个实例都具有自己的categorys属性副本。他们互不影响。
var d1 = new Dog();
d1.categorys.push("dog");
// console.log(d1.categorys); // [ 'cat', 'rabbit', 'dog' ]
var d2 = new Dog();
// console.log(d2.categorys); // [ 'cat', 'rabbit' ]
console.log(d2.name);
console.log(d2.age);
// 总结:经典继承解决了原型上出现引用值导致的继承问题和子类构造函数的实例不能向父类构造函数传参的问题.但是经典继承也存在自己的问题:1.在父类构造函数上声明多个方法会造成内存的浪费,2.子类的实例不能访问父类原型上的方法和属性.所以经典继承函数也不单独使用