JavaScript中所有的对象都有一个[[ prototype ]] 的内置属性,其实就是其他对象的引用。在你引用对象的属性时,会触发[[ GET ]]操作,会在当前的作用域里边寻找是否存在这个属性,如果没有就往上寻找。这个过程就是对象prototype的链式操作。
prototype的对象尽头就是Object.prototype
Object.prototype里边到底有什么:
一些常用的toString()、valueOf() 方法。
属性的设置与屏蔽
一个简单的赋值操作: obj.foo = 'bar';可能会发生以下三种可能。
1、在 prototype 链上存在 foo 属性,但是数据访问属性没有被标记为可读writable:false;
那么js就直接在你的obj中创建一个新的foo 的属性并赋值为 “bar”,这就是屏蔽属性。
2、如果在prototype 上面有foo,且被标记为writable: false,那么js无法修改已有属性或在obj上创建新的foo 。浏览器在严格模式下还会抛出一个错误,这条赋值会被忽略,不被执行最后。
3、如果在prototype上存在 foo 属性,而且他是一个setter,那就一定会调用这个setter,foo 不会被重新定义在obj中而且不会添加到obj。
这些情况会产生屏蔽:
myObj.val ++ 操作相当于myObj.val = myObj.val + 1,++ 操作会先从prototype上面查找val这个属性,然后从obj1上面找到了这个val并执行val = val+ 1;接着用[[ PUT ]]操作把赋值后的val赋给myObj。