function Animal(age) {
this.age = age;
this.sleep = function () {
console.log('我会睡觉');
}
}
//将固有的方法直接定义在原型对象上,所有对象的实例都可以共享该方法
Animal.prototype.eat = function () {
console.log(this.name + '会吃饭');
}
function Fish(age, name) {
Animal.call(this, age)
this.name = name;
}
//Fish的原型对象指向Animal的实例 有如下几种方法
// Fish.prototype=Animal.prototype; //子动父动
// Fish.prototype = new Animal(6); //当父构造函数有参数时,该方法不严谨
// Fish.prototype.__proto__ = Animal.prototype;
// Object.setPrototypeOf(Fish.prototype,Animal.prototype);
Fish.prototype = Object.create(Animal.prototype); //Object.create可以创建一个对象并返回,这个对象的原型指向第一个参数
//Fish的原型拥有Animal的实例的全部属性和方法
// Fish的原型的__proto__属性指向Animal的原型,Fish的实例拥有Animal实例以及Animal的原型的全部属性和方法
console.log(Fish.prototype.__proto__ == Animal.prototype); //true
// 此时Fish的原型的constructor 指向为 Animal
console.log(Fish.prototype.constructor);
// 修复Fish的原型的constructor 指向为 Fish 目的是防止原型链的混乱
Fish.prototype.constructor = Fish;
console.log(Fish.prototype.constructor);
//必须在修复Fish的原型的constructor 指向后添加属性
Fish.prototype.sex = 'male';
Fish.prototype.do = function () {
console.log(this.name + '会游泳');
}
var fish = new Fish(5, '鲤鱼');
console.log(fish);
fish.eat();
fish.do();
console.log(fish.sex);