对象的成员操作
对象的存值
存值:先找对象中是否有这个属性,没有则添加该属性保存值,有则覆盖属性的值。
对象的取值
取值:取属性的值时,对象中有该属性则取出该属性最后一次修改的值,没有该属性则取出undefined。
对象有原型对象的成员操作
对象的存值
存值:如果没有这个属性就直接在自己引用的内存空间创建这个属性,有该属性就更新值。并不会访问原型对象引用的内存空间上的成员然后去修改值
对象的取值
取值:(就近原则,自己有则取自己的值)取一个对象的属性值,自己引用的内存空间没有就取原型对象引用的内存空间,也没有就取原型对象的原型对象直到null没有就取出undefined
原型对象的操作
操作原型对象的成员值
f1.proto.x=20和 fn.prototype.x=20都是在原型对象引用的内存空间添加成员;区别在于f1.__proto__必须要在构造函数创建出来对象之后才能使用先有对象才能使用其原型对象,而fn.prototype是一开始函数创建就存在这个原型对象可以操作。
操作原型对象的对象
修改原型对象的对象则将系统内置的空对象修改为另一个对象,让构造函数的prototype属性指向另一个对象,则用这个构造函数创建的对象的原型对象就会被修改为指向的对象。
系统内置的构造函数的原型属性
自定义函数可以修改原型属性prototype,系统内置的函数(String、Number、Bloolean、Array、Date、Math)的原型属性prototype是不能用等号直接替换(代码会被静默) 但是可以添加或者重写其原型对象的成员。
跳过编译(静默):写的代码没执行但也不会报错。
对象直接操作原型对象
对象的成员操作如果没有修改原型对象的成员,只是修改成员内部的数据是可以的。(因为引用数据的引用改变了系统才会判定其发生变化)
对象的成员操作不会影响原型对象的成员,即如果用对象操作原型对象,只能修改原型对象的成员内部数据,不能修改原型对象的成员。用对象直接修改原型对象的成员相当于操作对象的成员。
不用prototype和__proto__修改原型对象,用对象操作原型对象(前提条件:对象自己本身没有这个属性,这个属性是原型对象的属性,只要不修改原型对象就可以,而是修改了原型对象成员的内部值)