构造函数继承
在子类构造函数中借用call调用父类构造函数
function Person(name){
this.name = name;
this.country='china';
}
Person.prototype.play = function(){
}
function Child(name,age){
this.age = age;
Person.call(this,name)
}
var obj = new Child('小明',16);
复制代码
子类继承了父类的属性和方法,但是相当于每个实例都拷贝了一份父类的方法,占用内存大
原型继承
利用prototype将子构造函数的prototype指向Person达到继承的目的
;
function Person(name){
this.name = name;
this.country='china';
}
Person.prototype.play = function(){
}
function Child(age){
this.age = age;
}
Child.prototype = new Person();
复制代码
实现了继承,但是无法给父构造函数传参
组合继承
基于以上两种继承方式的缺点,结合二者实现继承
function Person(name){
this.name = name;
this.country='china';
}
Person.prototype.play = function(){
}
function Child(name,age){
Person.call(this,name);
this.age = age;
}
Child.prototype = new Person();
复制代码
拷贝继承 把一个对象中的属性和方法复制到另一个
浅拷贝
function shallowCopy(source, target = {}) {
var key;
for (key in source) {
if (source.hasOwnProperty(key)) { // 意思就是__proto__上面的属性,我不拷贝
target[key] = source[key];
}
}
return target;
}
复制代码
深拷贝
(对象里面嵌套对象才涉及深拷贝)
function deepCopy(source, target = {}) {
var key;
for (key in source) {
if (source.hasOwnProperty(key)) { // 意思就是__proto__上面的属性,我不拷贝
if (typeof(source[key]) === "object") { // 如果这一项是object类型,就递归调用deepCopy
target[key] = Array.isArray(source[key]) ? [] : {};
deepCopy(source[key], target[key]);
} else { // 如果不是object类型,就直接赋值拷贝
target[key] = source[key];
}
}
复制代码
深拷贝黑科技
var targetObj = JSON.parse(JSON.stringify(copyObj))
缺点:
1、如果你的对象里有函数,函数无法被拷贝下来
2、无法拷贝copyObj对象原型链上的属性和方法
复制代码