// 原型链的问题
// 1.原型中包含引用值导致的继承问题
// 创建一个Animal对象
function Animal() {
this.categorys = ["cat", "rabbit"];
}
// 创建Dog对象
function Dog() { }
// 继承
// 实例中的属性变成了原型中的属性
Dog.prototype = new Animal();
// 创建Dog实例d1
var d1 = new Dog();
// 调用Dog原型上的属性categorys,给这个数组的末尾添加一个元素
d1.categorys.push("dog");
// 打印Dog原型上的属性categorys
console.log(d1.categorys);//[ 'cat', 'rabbit', 'dog' ]
// 创建Dog实例d2
var d2 = new Dog();
// 打印Dog原型上的属性categorys
console.log(d2.categorys);//[ 'cat', 'rabbit', 'dog' ]
// 给一个Dog实例上的categorys做操作,另一个Dog实例上的categorys也会发生同样的变化,因为继承的时候Animal对象的实例属性变成了原型对象的属性,原型对象的属性会共享给每一个实例.所以一个实例操作共享属性,另一个实例调用这个共享属性也会出现同样的变化,只要这个属性是引用类型,基本类型不会发生变化.
// 子类在实例化时不能给父类构造函数传参
// 因为原型链的这两种问题,导致原型链基本不会被单独使用