
对象新建属性对原型链的影响
当赋值为简单类型值(如数字或字符串)时,赋值仅影响目标对象的属性,而不修改原型链中的属性。 当赋值为对象或数组时,若赋值目标为同名属性(如 若赋值目标为非合法变量名(如
发布日期:2021-05-09 16:00:10
浏览次数:21
分类:精选文章
本文共 1242 字,大约阅读时间需要 4 分钟。
原型链赋值与对象属性的深度探讨
在 JavaScript 的原型链模型中,对象属性的赋值方式对原型链的影响是一个经典问题。本文将从不同角度探讨这一现象,并分析其背后的原理。
情况1:简单函数属性的赋值
function f() {}f.prototype = { x: function () {}};b = new f();c = new f();c.x = 10;console.log(c.x);console.log(b.x);
在上述代码中,c.x = 10
只是在 c
的对象空间中创建了一个新的属性 x
,并未修改原型链中的 x
属性。因此,b.x
和 c.x
的值相同,均指向原型链中的函数对象。
情况2:原型直接赋值的特殊性
function f() {}f.prototype = { x: 1};b = new f();c = new f();c.x = 10;console.log(c.x);console.log(b.x);
在情况2中,f.prototype.x
被直接赋值为 1
。当 c.x = 10
时,只是修改了 c
的对象空间中的 x
属性,而原型链中的 x
属性并未改变。因此,b.x
和 c.x
的值均为 1
。
情况3:嵌套对象属性的赋值
function f() {}f.prototype = { x: { a: 1 }};b = new f();c = new f();c.x['a'] = 10;console.log(c.x['a']);console.log(b.x['a']);
在情况3中,c.x['a'] = 10
只是修改了 c.x
对象的 a
属性,而非原型链中的 x
属性。因此,b.x['a']
和 c.x['a']
的值均为 1
。
情况4:数组属性的赋值
function f() {}f.prototype = { x: [1, 2, 3]};b = new f();c = new f();c.x[1] = 10;console.log(c.x[1]);console.log(b.x[1]);
在情况4中,c.x[1] = 10
只是修改了 c.x
数组的第二个元素,而并未改变原型链中的 x
属性。因此,b.x[1]
和 c.x[1]
的值均为 2
。
原型链赋值的特殊性
从上述情况可以看出,对象属性的赋值方式对原型链的影响取决于赋值的方式:
x
),则会覆盖原型链中的 x
属性,导致原型链的修改。x['a']
),则不会影响原型链中的属性。这种特性使得 JavaScript 的原型链赋值行为具有特殊性,需要开发者谨慎处理,以避免意外修改原型链属性。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月09日 05时46分33秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
wxWidgets源码分析(9) - wxString
2019-03-06
Mybatis Generator最完整配置详解
2019-03-06
[白话解析] 深入浅出熵的概念 & 决策树之ID3算法
2019-03-06
[梁山好汉说IT] 梁山好汉和抢劫银行
2019-03-06
[源码解析] 消息队列 Kombu 之 基本架构
2019-03-06
[源码分析] 消息队列 Kombu 之 启动过程
2019-03-06
[源码分析] 消息队列 Kombu 之 Consumer
2019-03-06
[源码分析] 消息队列 Kombu 之 mailbox
2019-03-06
抉择之苦
2019-03-06
wx.NET CLI wrapper for wxWidgets
2019-03-06
ASP.NET MVC Action Filters
2019-03-06
兰州大学百年校庆--风雨百年萃英路
2019-03-06
Eucalyptus企业云计算
2019-03-06
Service Broker 无法工作的问题修复
2019-03-06
WCF WebHttp Services in .NET 4
2019-03-06
Powershell中禁止执行脚本解决办法
2019-03-06
HTTP协议状态码详解(HTTP Status Code)
2019-03-06
JMeter 中实现发送Java请求
2019-03-06