特殊行为对象

在固有对象和原生对象中,有一些对象的行为跟正常对象有很大区别。

它们常见的下标运算(就是使用中括号或者点来做属性访问)或者设置原型跟普通对象不同,这里我简单总结一下。

  • Array:Array的length属性根据最大的下标自动发生变化。
  • Object.prototype:作为所有正常对象的默认原型,不能再给它设置原型了。
  • String:为了支持下标运算,String的正整数属性访问会去字符串里查找。
  • Arguments:arguments的非负整数型下标属性跟对应的变量联动。
  • 模块的namespace对象:特殊的地方非常多,跟一般对象完全不一样,尽量只用于import吧。
  • 类型数组和数组缓冲区:跟内存块相关联,下标运算比较特殊。
  • bind后的function:跟原来的函数相关联。

 

函数对象的定义是:具有[[call]]私有字段的对象,构造器对象的定义是:具有私有字段[[construct]]的对象。

 

我们大致可以认为,它们[[construct]]的执行过程如下:

  • 以 Object.protoype 为原型创建一个新对象;
  • 以新对象为 this,执行函数的[[call]];
  • 如果[[call]]的返回值是对象,那么,返回这个对象,否则返回第一步创建的新对象。

这样的规则造成了个有趣的现象,如果我们的构造器返回了一个新的对象,那么new创建的新对象就变成了一个构造函数之外完全无法访问的对象,这一定程度上可以实现“私有”。

function cls(){
    this.a = 100;
    return {
        getValue:() => this.a
    }
}
var o = new cls;
o.getValue(); //100
//a在外面永远无法访问到

  

posted @ 2020-09-10 15:38  雲天望垂墨傾池  阅读(122)  评论(0)    收藏  举报