javascript是为了成为轻量级的语言而开发的。开发者并没有选择像其他面向对象的语言一样,定义类(class),而是使用了protopype实现继承。
每一个函数在创建时,都会创建它的Prototype.
而这个函数,如果被用来创造实例,则被称为构造函数(constructor)。
在c++语言中,构造函数是这样的.
class A{
public:
A();//声明constructor
}
在js中,被实例化出的对象,拥有一个属性。指向它的构造函数。
function A(){}
let a = new A()
a //A {} ,如下图
a.__proto__.constructor 即构造函数。
A.prototype具有一个constructor属性,指向A本身: ƒ A()

继承的意义,简单来说,就是把相同的数据或方法,存在同一块内存地址中,可以被不同的实例使用(节省空间)。
如果两个实例,拥有同一个prototype,那么它们就可以共用这个prototype。
对象间"继承"的方法:
1.如果构造函数不同的实例,怎样使用相同的prototype呢?
答案1 ,apply || call (构造函数继承)
function Human(){
this.species = "人类";
}
function Man(name){
Human.apply(this,arguments);
this.name = name;
}
let kk = new Man("kk");
kk.name //"kk"
kk.species //"人类"
答案2,覆盖prototype(原型链继承)
function Human(){
this.species = "人类";
}
function Man(name){
this.name = name;
}
Man.prototype = new Human();//使用实例替换原来的prototype
Man.prototype.constructor = Man;//替换实例的constructor。
let p = new Man("p")

答案3,组合继承(1,2两种都用。)也就是说,既有了复制过来的属性,然后又可以用prototype。
答案4:在prototype上面定义属性,而不是this。(原型继承?)
Human.prototype.like ="sugar";
Man.prototype = Human.prototype;//同样替换了Prototype.但是此时的prototype就是Human的prototype,就不可以替换掉它的constuctor了。
let e = new Man("e");
e.like//"sugar"
答案4:拷贝继承.
把其他prototype上的方法复制到自己的Prototype上。
2,如果要继承的对象并没有构造函数如何实现继承呢?
1.把要继承的对象附加到原型链上
function copyObject(parent){
var f = function(){};
f.prototype = parent;
return new f();
}
let hair = {
hairType:"black"
}
let t = copyObject(hair);
t.hair //"black"
2.deep copy
function deepCopy(p, c) {
var c = c || {};
for (var i in p) {
if (typeof p[i] === 'object') {
c[i] = (p[i].constructor === Array) ? [] : {};
deepCopy(p[i], c[i]);
} else {
c[i] = p[i];
}
}
return c;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业