js继承之寄生组合继承
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 寄生组合继承(经典继承)
缺点:重写 Sub.prototype ,那如果 原先的 Sub.prototype 里面有方法,
那这样重写就会失去之前的方法,
采用圣杯模式来解决 -->
<script>
function Super(){
// console.log(this); // window
this.a=[1,2,3,4];
}
Super.prototype.say=function(){
console.log(222);
}
// 下面的这两步就是寄生组合继承的实现,能够使用原型上的方法,又能避免引用共享的问题
function Sub(){
Super.call(this);
}
// 下面这行的意思是:指定 Sub.prototype 的 prototype 是 Super.prototype
// Object.creat(参数) 函数的意思是 等号左边对象的原型被指定为 参数
Sub.prototype=Object.create(Super.prototype); // 这一步实现了避免两次 new 的问题,越过了 new Super() 这一步,直接指定他的原型对象
// 但是上面这一步属于是重写 Sub.prototype ,那如果 原先的 Sub.prototype 里面有方法,
// 那这样重写就会失去之前的方法,
var sub1=new Sub();
var sub2=new Sub();
// console.log(sub1);
// console.log(sub2);
sub1.a.push(5);
sub1.say();
sub2.say();
console.log(sub1);
console.log(sub2);
</script>
</body>
</html>