【JavaScript】prototype定义的属性在实例中的表现

本文解析JavaScript中构造函数的prototype属性与实例属性的区别,强调直接修改实例属性不会影响prototype,需通过__proto__访问原型进行修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

众所周知,用构造函数的prototype定义的属性将被所有实例共享,有节省空间和加快初始化速度的优点。

可是在初学之时,prototype具体的表现不容易理解,特别是跟Java的static变量类比时,有一个区别特别容易混淆:不能直接通过修改实例的属性影响prototype定义的属性。

举个栗子,在Java中,可以通过实例修改static变量的值,修改后的值将影响该类的所有实例。而在JavaScript,具体的表现却不是这样:

// 定义一个类A
function A() {
}

// 通过prototype添加一个属性a
A.prototype.a = 1;

// 实例化
// 此时对象o为{}
o = new A();

// 打印继承得到的a的值
// 输出:1
o.a;

// 通过prototype修改a的值
A.prototype.a = 2;

// 打印此时a的值
// 输出:2
o.a;

// 通过对象o修改a的值
o.a = 3;

// 打印对象o
// 输出:{a:3}
o;

// 打印A中a的值
// 输出:2
A.prototype.a;

可以看到,通过对象o修改a的值时,实际上是在对象o中添加了一个属性a,该属性覆盖了A中的a。同理,对于方法来说也是覆盖。

要想像Java中的static变量一样,可以通过实例修改其值,可以通过访问实例的__proto__属性实现:

// 通过__proto__修改原型中的属性
o.__proto__.a = 3;

// 打印A中a的值
// 输出:3
A.prototype.a;

__proto__是每个对象都有的一个属性,而prototype是函数才会有的属性,它可称为隐式原型,指向构造该对象的构造函数的原型,它可以让实例能够访问在构造函数原型中定义的属性和方法。比如在console中打印A的prototype和对象o的__proto__作对比:

// 打印A的prototype
// 输出:{a: 5, constructor: ƒ}
A.prototype;

// 打印o的__proto__
// 输出:{a: 5, constructor: ƒ}
a.__proto__;

即实例的__proto__就是构造函数的prototype。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值