// 原型继承
function Person(name,age){
this.name=name;
this.age=age;
}
// 利用原型中的成员可以被和其他相关的对象共享这一特性,可以实现继承
Person.prototype.sayHello=function(){
console.log("我想死你了");
}
// 1 给原型对象中添加成员(通过对象的动态特性) 不是严格意义上的继承
var p=new Person("冯巩",50);
p.sayHello();
// p对象就继承了原型对象
// 2 直接替换原型对象。 会将原有原型中的成员丢失
var parent={
sayHello2:function(){
console.log("hello")
}
}
Person.prototype=parent;
var p2=new Person("赵本山",60);
p2.sayHello2();
// p2.sayHello(); 会将原有原型中的成员丢失 p2.sayHello is not a function
// p对象继承了原型对象(parent)
// 3 利用混入的方法给原型对象添加成员
var grandP={
SayBey:function(){
console.log("bye")
}
}
for(var k in grandP){
Person.prototype[k]=grandP[k]
}
var p3=new Person("白云","44")
p3.SayBey();
// 也是实现了继承
// 继承的方法
let arr1 =[1,2,3];
Array.prototype.sayHello=function(){
console.log("hello")
}
console.log(arr1);
arr1.sayHello();
// 扩展内置对象 (给内置对象新增成员);
// 不推荐 系统共享 会修改他人的内置对象
// 安全的扩展一个内置对象
function MyArray(){
}
var arr23=new Array(); // 创建数组
MyArray.prototype=arr23; // 添加内置对象
var myArray=new MyArray; // 继承自arr23
myArray.push(1);
console.log(myArray); // 1
var arr2 = {
arr2Say:function(){
console.log("我是arr2");
}
}
MyArray.prototype=arr2; // 添加say方法 就自己调用自己的方法
var ArrSay=new MyArray; // 创建构造函数
ArrSay.arr2Say();
var guodegang={
xiangsheng:function(){
console.log("我来将相声了");
}
}
MyArray.prototype=guodegang;
var guoqiling=new MyArray;
guoqiling.xiangsheng();
// 继承的方法2
function Animail(){
this.gender="male";
}
Human.prototype=new Animail();
Human.prototype.constructor=Human;
function Human(){
this.actionWay="走路";
}
Teacher.prototype=new Human();
Teacher.prototype.constructor=Teacher;
function Teacher(){
this.skill="教书";
}
BadTeacher.prototype=new Teacher();
BadTeacher.prototype.constructor=BadTeacher;
function BadTeacher(){
this.name="吕超";
}
var t=new BadTeacher();
// 控制台 t.__proto__ 继承的应用