The instanceof operator tests whether an object in its prototype chain has the prototype property of a constructor.
我们在字符串的基本类型上调用属性和方法,引擎会自动地将它转换为 String 对象,所以这些属性/方法是可以正常工作的。
如果你使用字符串以外(基本)类型的值,它会首先被转换为字符串。这甚至包括在数组中常用于索引的数字,所以要小心不要将对象和数组使用的数字搞混了。
如果你 恰好 从属性访问中得到一个函数,它也没有魔法般地变为一个“方法”。一个从属性访问得来的函数没有任何特殊性。 虽然函数有时确实拥有 this 引用,而且 this 引用指向调用点的对象引用。但这个用法真的没有使这个函数比其他函数更像“方法”,因为 this 是在运行时调用点动态绑定的,这使得它与这个对象的关系至多是间接的。
Object.assign(..) 接收 目标 对象作为第一个参数,然后是一个或多个 源 对象作为后续参数。它会在 源 对象上迭代所有的 可枚举 的 owned keys,并把它们拷贝到 目标 对象上(仅通过 = 赋值)。返回 目标对象。
function anotherFunction() { /*..*/ } var anotherObject = { c: true }; var anotherArray = []; var myObject = { a: 2, b: anotherObject, // 引用,不是拷贝! c: anotherArray, // 又一个引用! d: anotherFunction }; var newObj = Object.assign( {}, myObject ); newObj.a; // 2 newObj.b === anotherObject; // true newObj.c === anotherArray; // true newObj.d === anotherFunction; // trueES5 有几种不同的方式可以实现此功能,但是,所有这些方法创建的都是浅不可变性。
对象默认的 [[Put]] 和 [[Get]] 操作分别完全控制着如何设置既存或新属性的值,和如何取得既存属性。
ES5 引入了一个方法来覆盖这些默认操作的一部分,但不是在对象级别而是针对每个属性,就是通过 getters 和 setters。Getter 是实际上调用一个隐藏函数来取得值得属性。Setter 是实际上调用一个隐藏函数来设置值得属性。
var myObject = { // 为`a`定义一个getter get a() { return 2; } }; Object.defineProperty( myObject, // 目标对象 "b", // 属性名 { // 描述符 // 为`b`定义getter get: function(){ return this.a * 2 }, // 确保`b`作为对象属性出现 enumerable: true } ); myObject.a; // 2 myObject.b; // 4不管是通过在字面对象语法中使用get a() { .. },还是通过使用defineProperty(..)明确定义,我们都在对象上创建了一个没有实际持有值的属性,访问它们将会自动地对getter函数进行隐藏的函数调用,其返回的任何值就是属性访问的结果。
属性还应当被定义一个覆盖默认[[Put]]操作(也就是赋值)的setter。
var myObject = { // 为`a`定义getter get a() { return this._a_; }, // 为`a`定义setter set a(val) { this._a_ = val * 2; } }; myObject.a = 2; myObject.a; // 4注意: 在这个例子中,我们实际上将赋值操作([[Put]]操作)指定的值2存储到了另一个变量_a_中。_a_这个名称只是用在这个例子中的单纯的惯例,并不意味着它的行为有什么特别之处——它和其他普通属性没有区别。
in 操作符会检查属性是否存在于对象中,或者是否存在于 [[Prototype]] 链对象遍历的更高层中。相比之下,hasOwnProperty(..) 仅仅检查 myObject 是否拥有属性,但不会查询 [[Prototype]] 链。 当然,有的对象可能不会链接到 Object.prototype ,这种情况下,一种更加健壮的检查方式就是必要的了,如下:
Object.prototype.hasOwnProperty.call(myObject,"a")使用明确的 this 绑定,对 myObject 实施这个方法。
@@iterator 本身不是迭代器对象,而是一个返回迭代器对象的方法。
