这一节选出的内容不多,因为有大量篇幅在写例子以支持论述,我要是把那些例子都写在这里,你还不如去看原著.
另外还写了迭代器在对象操作上的应用.
但实际上开发中很少用到迭代器吧,而且列出的也不是出彩的应用方法,一些常规使用,这里就不写.
以下是我觉得不错的说法:
“在引擎内部,存储在对象容器内部的是这些属性的名称,它们就像指针(技术角度来讲叫引用)一样,指向这些值真正的存储位置.”
你肯定也遇到过对象引用导致的错误,你在后面的代码修改了对象属性值,结果前面代码呈现的属性值也变了,就是因为这个.
“从技术角度讲,函数永远不会"属于"一个对象,所以把对象内部引用的函数称为’方法’似乎有点不妥.”
如果属性访问返回的是一个函数,那它也并不是一个"方法."只是把一个对函数的引用作为了一个属性的值.
"[[Get]]“是一种操作,对象默认内置”[[Get]]“操作,首先在对象中查找该属性的值,找到返回,找不到则查找原型链.访问属性会实现”[[Get]]"操作.
"[[Put]]"操作实现时,实际行为取决于许多因素,给对象赋值实现访问时:
已有描述符: 有setter则调setter;
writable为false: 静默失败;
均不符合: 将值设置为属性值;
一个属性有getters&setter或均有时,将被定义为"访问描述符".
定义setter后,[[Put]]行为会被其覆盖.
如何区分属性的值是undefined还是该属性不存在?
不访问属性值情况下判断:
console.log("a" in objA); // true;
console.log(objA.hasOwnProperty("a")); // true
区别为in在对象内没找到时会去检查原型链.