子类继承父类的私有属性以及公有属性(es5)
<!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>
<script>
// console.log(Object.prototype.__proto__);
function Person(name) {
this.name = name;
this.arr = [1, 2, 3, 4];
}
Person.prototype.address = {
location: "北京",
};
// let a2 = new Person("小谢");
// 调用两次 相当于创建了两次arr
// console.log(a1.arr === a2.arr);
// console.log(a1.__proto__ === Person.prototype);
// 构造函数是普通函数的实例
// console.log(Person.__proto__ === Function.prototype);
// console.log(a1);
// console.log(a1.__proto__);
// console.log(a1.__proto__.__proto__ === Object.prototype);
function Son(name) {
this.age = 20;
// 继承父类的私有属性
Person.call(this, name);
}
/* 为了实现子类构造函数能继承父类的方法,有以下两种实现方式
1.继承公有
2.寄生组合继承
*/
// 1.继承公有
Object.setPrototypeOf(Son.prototype, Person.prototype);
// 2.寄生组合继承
// Son.prototype = Object.create(Person.prototype, {
// constructor: { value: Son },
// });
/*
Son.prototype = new Person();
污染父类 子类的实例 可以基于 __proto__ 直接把父类原型上的方法改掉
比如
Person.prototype.address = {
location: "北京",
};
s.__proto__.__proto__.address = 1;
let a1 = new Person("小林");
console.log(a1.address); // 1
*/
Son.prototype.hobby = function () {
console.log("111111111");
};
let s = new Son("小谢子");
console.log(s.arr);
console.log(s.address);
// console.log(s);
// console.log(a1);
// console.log(s.address); // {location: "北京"}
</script>
</body>
</html>