广义上的js继承:
如果能通过某种方式,让某个对象访问到其他对象中的属性、方法,那么我们就把这种方式称之为继承
一. 拷贝继承
+我们来用代码实现一下拷贝继承
//1、已经拥有一个对象
var o4 = {};
var o3 = {gendar:"男","grade:"初三",group:"第五组",name:"张三"}
//2、创建一个对象的拷贝(克隆)for,,in循环
//a、去除对象中的每一个属性
for(var key in o3){
//b、获取到对应的属性值
var value = o3[key];
//c、吧属性值放到另一个对象中
o4[key] = value;在这里插入代码片
}
+我们也可以修改克隆对象,把属性修改:
o4.name = "李四";
//es6中有了<对象扩展运算符>:
var source = {gendar:"男",“grade:"初三",group:"第五组",name:"张三"};
var target = {...source}
var target2 = {...source,age:18}
二. 原型式继承
+场景:
1、创建一个纯洁对象(什么属性都没有)
function person(){};
var p1 = new person();
//此时控制台输出两个对象都是undefind
//person对象里面只有一个_proto_属性
+所以纯洁对象并不代表里面什么都没有
+那么里面什么都没有的对象怎么声明呢?也就是空对象
var obj = Object.create(null);
+创建一个继承自某个父对象的子对象
var parent = {age:19,gener:"男"};
var student = Object.create(parent);
//student._proto_===parent
//...
三. 借用构造函数实现继承
+场景:使用于两种构造函数之间逻辑有相似的情况
+原理:函数call、apply调用方式
function Animal(name,age,gender){
this.name = name;
this.age = age;
this.gender = gender;
}
function Person(name,age,gender,say){
this.name = name;
this.age = age;
this.gender = gender;
this.say = function(){
};
}
+使用构造函数实现:
function Animal(name,age,gender){
this.name = name;
this.age = age;
this.gender = gender;
}
function Person(name,age,gender,say){
//这种函数的调用方式,函数内部的this只能指向window
Animal(name,age,gender);
//目的:将Animal函数内部的this只想Person实例
Animal.call(this,name,age,gender)
//上面代码等价于
Animal.apply(this,[name,age,gebder]);
this.say = function(){
};
}
var p1 = new Person("宋小宝",15,"男",function(){});