原型和原型链
声明一个构造函数,通过 new 构造函数名() 得到一个实例化对象,当声明一个函数(普通函数、构造函数等任何函数)时,产生一个原型对象,原型对象本身还有一个原型对象,创建它的构造函数为 object ,实例对象通过 实例对象.__proto__ 访问它的原型对象,构造函数通过 构造函数.prototype 访问原型对象,而原型对象通过 原型对象.constructor 访问创造出它的构造函数,实例对象通过 实例对象.constructor 访问构造函数。
原型链:当new一个实例化对象后,需要什么属性,方法时,自身没有就会访问原型对象,没有再访问原型对象的原型对象,直到返回null。
原型继承
儿子继承父亲的属性
通过 函数名.call() 继承父亲的属性
this 指向当前调用它的最终的对象
call() 1、立即调用并执行函数;2、改变this指向;3、传递字符形式的参数
function Father(name,age,sex){
//this 指向创建的实例对象
this.name = name;
this.age = age;
this.sex = sex;
}
function Son(name,age,sex,phone){
//继承父亲的属性
Father.call(this,name,age,sex);
//自身的属性
this.phone = phone;
}
儿子继承父亲的方法
通过父亲的构造函数,new一个对象,将创建的新对象赋值作为儿子的原型对象,而它同时也是父亲的一个对象,并且现在作为儿子的原型对象存在,所以这个原型对象通过原型对象.constructor要可以访问到它的构造函数
//父亲的方法
Father.prototype.money = function(){
console.log(this.name+"----挣钱中");
}
//继承父亲的方法
//通过new 将父构造函数 的 实例对象 赋值给 son 的 原型对象
Son.prototype = new Father();
//利用 constructor 手动改变Son的原型对象的指向的构造函数
Son.prototype.constructor = Son;
//儿子的方法
Son.prototype.game = function(){
console.log(this.name + "玩游戏");
}
实例化对象,调用方法
let f = new Father("曹操",50,"男");
let s = new Son("曹植",20,"男","15321546464");
console.log(f,s);
f.money();
s.money();
s.game();
执行结果