关于javascript原型链上的属性

本文探讨了JavaScript中对象原型链上属性的修改行为。通过`Object.getOwnPropertyNames()`方法观察原型链结构,发现修改非引用属性只会直接影响实例对象,而修改引用属性如对象会追溯到原型链,影响所有相关实例。总结建议,不变属性适合放在原型继承,易变的普通对象属性应定义在构造函数上。

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

Object.getOwnPropertyNames()

方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性)组成的数组。
好吧返回结果是数组

把这个API,放在这里是因为它可以方便的观察对象的原型链的结构。这里对于原型链就不做笔记了

//创建一个构造函数
function P()
    {
        this.name="lishi";
        this.age=18;
    }

//给P这个构造函数指定一个原型对象
P.prototype={
    get_age:function(){
        console.log(this.age)
    },
    long:"1.4m",
    menu:{
        a:1,
        b:2
    }
}

//实例化对象
var p=new P();

//现在修改一个原型链上的属性值
p.long="2m";
console.log(p.long);    //2m,事实证明是修改成功了的

//修改原型链对象上menu对象a属性的值
p.menu.a=3;
console.log(p.menu);   //{a:3,b:2}

问题来了如果我再次实例化P,

1.直接输出原型链上long的值,是否发生变化
2.直接输出原型链上menu的值,是否发生变化


//1.测试
var o=new P();
console.log(o.long);        //1.4m

结果是由p对象发起的修改原型链上的long属性值,会直接在p对象上添加或修改这个属性(已经存在的);并没有去作用到原型链中的属性值

//2.测试menu值
console.log(o.menu);        //{a:3,b:2}

结果是由p对象发起的修改原型链上的menu属性,如果menu属性是一个对象等,会追根溯源到原型链上,修改后就会影响后面创建的实例对象引用

引用之前我看过的文章来总一下

修改这个对象的非引用属性会直接在对象上添加或修改这个属性(已经存在的)
修改引用属性如对象则会追根溯源到原型链上,修改后就会影响后面创建的实例对象。
因此如果有代码想要重复使用而不是要反复修改的属性,就写在原型上去继承,而表示特色的属性尤其是要经常修改的普通对象要写在构造函数上。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值