'z' in obj: 会在原型链上查找
obj.hasOwnProperty('z'): 实在自身查找属性
已经实例化的对象,如果更改它继承的prototype,不会更改对象的属性了
不能改变已经创建出的实例的指向,改变的只是 prototype。如果 prototype 的指针变化,不会影响之前创建的实例已经有的指针,之前实例的指针还是指向原来创建他时的 prototype 的指针
正常啊 因为赋值是引用赋值 修改了的是指向的对象的引用 而不是原指向
就像链表 不能修改指向的这个对象自己的地址 而是应该修改用来指向的那个上级指针(next)指向的地址(哎 懂得自然懂了)
这么说 不修改指针的指向 只是修改指向的内容(还没覆盖第二层的指针) 那么在内存层面 原先是没有改变的 因为新赋予的对象地址可能在银河系之外 所以原先的指向的值没有发生改变
控制对象属性的特性 defineProperty
拿到对象上的属性:obj.hasOwnProperty('xxx')
新增Object的prototype属性的属性
注意:用in会将原型链上的属性全都遍历。
obj.hasOwnProperty();可以判断参数是否是对象里面的。
子类bosn的原型__proto__已经指向了原来的Student.prototype。所以再对Student.prototype={}进行修改,也不会影响boson的原型。
当然,修改后再new一个实例,则会受此影响。
in 与 hasOwnProPerty("z")
内置构造器的protoype defineProperty
不能修改原型上已经存在的属性
动态修改prototype具体的某个属性值时,已创建的实例会受到影响。
而对prototype整个进行赋值时,已创建的实例不会受到影响,但是会影响后续创建的实例
对之前的函数的prototype,修改属性值,调用时可以获取修改的;但是对整个prototype修改,已经创建的实例,仍然可以拿到
改变prototype:如果是针对某个对象的修改,会改变已经实例化的对象的属性,但是如果是字面量赋值给prototype,却不会印象已经实例化的对象,但会印象后续实例化的对象。如下图:
已经创建的实例使用原型的属性,当改变原型的prototype时,不会改变已创建实例的属性,会影响后续创建的实例;但是修改prototype的属性时会改变已创建的实例。
student.prototype.x=101;
bosn.x; //101
student.prototype={y:2};
bosn.y;//undefined
bosn.x;//101
var nun= new student('nunly',3,'class keng');
nun.x;//undefined
nun.y;//2
注意,obj.hasOwnproperty().属性
修改构造器原型的对象student,是会影响已经实例化的对象bosn;直接给student的原型赋值则不会影响,只会影响之后实例化的对象nunnly
判读一个属性是不是对象本身上的属性而不是向上查到的属性:
obj.hasOwnproperty("z") //返回blean true 或 false
修改对象的原型不会影响已经创建过的实例,但是会影响后续创建的实例。
//改变prototype Student.prototype.x = 101; bosn.x;//101 Student.prototype = {y:2}; bosn.y;// undefined bosn.x;//101 var nunnly - new Student('Nunnly', 3, 'Class LOL KengB'); nunnly.x;//undefined nunnly.y;//2 动态修改prototype的属性的时候会影响已创建和新创建的实例 修改整个prototype赋值新对象的时候,对已经创建的实例 是不会修改的,但是会影响后续创建的实例。
再记一次,hasOwnProperty检查属性是否在检查的对象上。
动态改变原型的属性值,会影响已经存在实例化对象的属性值。动态改变原型的属性,相应已经实例化对象的对应属性值并不会改变。新实例化对象对应属性值会改变。
改变prototype,对prototype里的属性进行增删会影响到以prototype为原型的实例对象;若prototype变为另一对象,比如为其赋值一个新的对象,则旧的原型指向prototype的实例对象依然不会被修改,若新建实例对象则,新的实例对象原型指向修改后的prototype。
清晰明了
修改prototype属性不会影响已创建的实例属性,只会影响后继创建的实例的属性。