JavaScript对象创建机制与原型继承原理详解
本文深入解析JavaScript中对象创建的底层机制,重点阐述Function构造器如何自动设置prototype及constructor属性。通过具体代码实例,详细演示如何利用原型链实现类继承,包括修正constructor、自动链接__proto__以及instanceof的判断逻辑,并指出IE内核在原型存储上的差异。
JavaScript对象创建与constructor机制
当函数对象通过Function构造器被创建时,内部会执行类似如下的初始化逻辑:
具体实现代码如下:
this.prototype={constructor:this}; 假设存在函数F
在使用new关键字构造对象时,生成的新对象其constructor属性会被自动指向该构造函数F的prototype属性所指向的constructor。
若在创建对象之前手动修改了函数的prototype属性,将直接导致新创建对象的constructor属性发生相应变化。
例如以下场景:
相关代码示例如下:
function F(){};
F.prototype={constructor:'1111'};
var o=new F();//此时o.constructor===‘1111'的结果为true 继承原理核心逻辑:
原型链继承原理与实例分析
JavaScript的继承机制基于原型链。每个函数实例共享构造函数prototype属性中定义的数据。若要实现类之间的继承,需将父函数的实例赋值给子函数的prototype属性。此外,在每次通过new创建实例对象时,对象的内部属性__proto__会自动链接到构造函数的prototype。
instanceof运算符的工作原理是遍历实例对象的__proto__属性链,以判断该实例是否属于指定类型的对象。
完整代码实例演示:
以下是instanceof相关功能的代码实现:
//模拟instanceof功能的实现
function Myinstanceof(obj,type)
{
var proto=obj.__proto__;
while(proto)
{
if(proto ===type.prototype)break;
proto=proto.__proto__;
}
return proto!=null;
}
function View(){}
function TreeView(){}
TreeView.prototype=new View();//此时TreeView.prototype.__proto__自动指向View.prototype
TreeView.prototype.constructor=TreeView;//手动修正constructor指向
var view=new TreeView();//此时view.__proto__自动指向TreeView.prototype
alert(view instanceof View); //输出true,因为在链中找到了view.__proto__.__proto__
alert(view instanceof TreeView); //输出true,因为在链中直接找到view.__proto__
alert(Myinstanceof(view,View)); //输出true
alert(Myinstanceof(view,TreeView)); //输出true 上述自定义的Myinstanceof函数旨在模拟原生instanceof的功能。需要注意的是,由于IE内核中实例存储原型的方式并非__proto__,导致该自定义函数在IE中无法正常运行,但在其他主流浏览器中通常表现正常。
JS处理含Emoji或中文的字符串转数组乱码问题
2026-11-05 16:12:28
JS怎么使用展开运算符合并对象
2026-11-05 14:42:18
ES6+环境下判断JS对象为空的简洁写法
2026-11-05 12:12:23
怎么通过replacer函数自定义JS中JSON的格式化输出
2026-11-05 11:19:44
JS正则表达式基础:字面量与RegExp构造函数的区别及常用元字符
2026-11-05 11:16:58
