JavaScript原型链机制与对象访问方式详解
本文详细解析JavaScript中通过原型链实现继承的核心机制。文章介绍了访问原型对象的三种方式:__proto__、Object.getPrototypeOf()及constructor.prototype,并对比了其浏览器兼容性与标准支持情况。同时深入剖析了使用new操作符创建对象时的内部执行步骤,阐明所有同构造函数生成的实例共享同一原型对象的原理,并通过代码示例验证原型链关系判断方法isPrototypeOf()的实际应用。
JavaScript原型链访问方式
JavaScript中的继承机制依赖于原型链(prototype chain)来实现。在JavaScript中,每个对象内部都包含一个指向另一个对象的引用,该对象即为其原型(prototype),当前对象由此继承其属性(property)。对于任意一个对象,可以通过以下三种方式访问其原型对象:
第一种方式是使用__proto__属性。通过访问对象的__proto__属性,可以直接获取其原型对象。需要注意的是,该属性在Firefox、Safari和Chrome浏览器中得到支持,但在IE和Opera浏览器中并不支持。
第二种方式是使用Object.getPrototypeOf()方法。该方法接受一个对象作为参数,执行后返回该对象的原型对象。此方法仅在符合ECMAScript 5标准的运行环境中得到支持。
第三种方式是通过constructor属性访问。首先获取对象的constructor函数,然后通过访问该函数的prototype属性来间接访问原型对象。使用此方法的前提是对象中存在指向构造函数的constructor属性。
若要判断两个对象之间是否存在原型链关系,可以使用isPrototypeOf()方法:
代码如下:
var p = {x:1};
var o = Object.create(p);
console.log(p.isPrototypeOf(o));//true
字面量与构造函数创建对象的原型差异
对于所有通过字面量方式创建的对象,其原型对象均为Object.prototype。作为一个特殊对象,Object.prototype本身没有原型对象:
代码如下:
var x = {a:18, b:28};
console.log(x.__proto__);//Object {}
而对于所有通过new操作符创建的对象,其原型对象均为对应constructor函数的prototype属性:
代码如下:
var x = {a:18, b:28};
function Test(c){
this.c = c;
}
Test.prototype = x;
var t = new Test(38);
console.log(t);//Object {c=38, a=18, b=28}
console.log(t.__proto__);//Object {a=18, b=28}
console.log(t.__proto__.__proto__);//Object {}
new操作符创建对象的内部机制
JavaScript中使用new操作符创建对象的过程如下:
1.创建一个新的空对象。 2.将这个对象的__proto__属性指向constructor函数的prototype属性。 3.将这个对象作为this参数,执行constructor函数。
从上述创建过程可以得出结论:所有从同一个constructor函数中构造出来的对象,其__proto__属性(也即其原型对象)相等,也就是说,只存在一个原型对象:
代码如下:
var t = new Test(38);
var t2 = new Test(68);
console.log(t === t2);//false
console.log(t.__proto__ === t2.__proto__);//trueES6模块化中js文件怎么用import和export交互
2026-11-05 17:00:48
JS读取本地文件时报错或无响应的常见原因
2026-11-05 16:32:31
let、const与var的区别:JavaScript变量声明最佳实践
2026-11-05 14:16:38
JS中直接定义静态二维数组的字面量写法
2026-11-05 14:16:08
JS 怎么查找字符串中所有匹配项的位置
2026-11-05 14:15:53
