关于Javascript原型链
首先,我们来定义一个构造函数:
function Bar() { }
这时候它的各种属性如下所示:
Bar.prototype.constructor;//Bar()
Bar.constructor;//Function()
Bar.prototype;//Bar{}
//-------------- 方案一 Begin ------------------
接下来,我们定义另一个构造函数:
function Foo() {this.value = 42;}
改变构造函数Foo的原型对象为一个Object,并且包含了一个方法method,
(注意:这时Foo的原型对象已经不是它本身了,而是Object { method=function()})
Foo.prototype = {
method: function () { alert("foo.method"); }
};
改变构造函数Bar的原型对象为Foo的一个实例:
Bar.prototype = new Foo();
这时候,我们输出Bar的各种属性如下:
Bar.prototype.constructor;//Object()
Bar.constructor;//Function()
Bar.prototype;//Object { value=42, method=function()}
//-------------- 方案一 End ------------------
但是,如果我们不用重新制定Foo的原型对象的方法来给它增加方法的方式,我们这样来做:
Foo.prototype.method = function () { alert("fooo.method"); }
//-------------- 方案二 Begin ------------------
即我们可以将上面的这样写:
function Foo() {this.value = 42;}
Foo.prototype.method = function () { alert("fooo.method"); }
Bar.prototype = new Foo();
这样,Foo的原型对象就不会被改变,仍然是它自己,即:Foo { method=function()},
那么这时构造函数Bar的各种属性输出应该是这样的:
Bar.prototype.constructor;//Foo()
Bar.constructor;//Function()
Bar.prototype;//Foo { value=42, method=function()}
//-------------- 方案二 End ------------------
综上所述,正是因为有以上两种情况的出现,为了维护原型链的正确性,我们需要重新制定构造函数Bar的原型对象的构造器:
Bar.prototype.constructor=Bar;
这时Bar的各种属性是这样的:
Bar.prototype.constructor;//Bar()
Bar.constructor;//Function()
Bar.prototype;//Bar { value=42, constructor=Bar(), method=function()}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端