<script type="text/javascript">
//原型链继承
//优点:子类对象 能够继承 父类对象以及父类对象的原型对象的成员(整个原型链上的成员)
//缺点:破坏了原型链(将子类自身的constructor丢了)
//定义父类构造函数
function A(){
this.age = 10;
}
A.prototype.say = function(){
console.log(100);
}
//定义子类构造函数
function B(){
}
//设置子类构造函数的原型对象 = 父类构造函数的实例对象
B.prototype = new A(); //会将B的实例对象自己的constructor属性丢了
// B.prototype.constructor = B;
var b = new B();
console.log(b.age);
b.say();
console.log(b.constructor);
</script>
<script type="text/javascript">
//冒充继承
//优点:不会丢失子类对象的constructor属性
//缺点:只能继承父类构造函数中设置的成员,不能继承父类原型对象上的成员
//父类构造函数
function A(){
this.age = 30;
}
A.prototype.say = function(){
console.log(320);
}
//子类构造函数
function B(){
//this 实例化后的 b
//使用子类this 去冒充 父类构造函数中的this, 并且直接调用父类构造函数
//父类中的成员都设置到了子类对象中
A.call(this); // call apply bind 三选一
// var obj = this;
// A.call(obj);
// A.apply(this);
// A.bind(this)()
}
var b = new B();
console.log(b.age);
console.log(b.constructor);
b.say();//报错
</script>
<script type="text/javascript">
//Object.create(父对象)方法继承
//
//创建一个新对象,并且指定其原型对象
//特点:适用于继承一个现有的对象,但是没有直接定义的构造函数
var person = {"age":30};
var obj = Object.create(person);
console.log(obj);
console.log(obj.age);
// var obj = new Object(); // var obj = {};
// obj.__proto__ = person;
</script>