JS面向对象---非构造函数之间的继承(阮一峰网络日志学习笔记)
通过对阮一峰老师文章的学习,已经自己手写了前面的两篇文章(都是看过软老师的,然后自己手写的)。今天要总结一下非构造函数之间的继承。
普通对象之间的继承。
var A = {gender: "男"};
var B = {name: "小明"};
问题是如何让B继承A的那么属性?(这两个对象都是普通对象,不是构造函数,无法使用构造函数方法实现"继承"。)
解决方法:
一、object()方法
json格式的发明人Douglas Crockford(道格拉斯·克罗克福德),提出了一个object()函数,可以做到这一点。
function object(o) {
var F = function(){};
F.prototype = o;
return new F();
}
var B = object(A);
console.log(B.gender === "男"); // true
通过创建一个空对象作为中介构造函数,并将该构造函数的原型指向目标对象,然后返回一个该构造函数的实例。
使用:
那么使用的时候,新对象便会自动继承目标对象的属性了。
二、拷贝
通过拷贝目标对象的各个属性,直接放在新对象上面,那么新对象就可以继承目标对象的属性了。
2.1浅拷贝 只适合拷贝基本类型的属性的对象
function lightCopy(p) {
var c = {};
for (var i in p) {
c[i] = p[i];
}
return c
}
使用:
var B = lightCopy(A);
B.name = "小明";
console.log(B.gender === "男"); // true
2.2 深拷贝
function deepCopy(p, c) {
var c = c || {};
for (var i in p) {
if (typeof p[i] == "object") {
c[i] = (Object.prototype.toString.call(p[i]) == "[object Array]") ? [] : {};
deepCopy(p[i], c[i]);
} else {
c[i] = p[i];
}
}
return c
}
使用:
var B = deepCopy(A);
console.log(B.gender === "男"); // true
看了阮老师文章下面别人的评论,有些地方不太明白,不了解具体的现实场景是怎样的,放在这里记录一下:(如果有人看到,能举个具体的例子就谢谢啦^^)