JavaScript 中的对象分类
- 宿主对象:由JS宿主环境提供的对象,它们的行完全由宿主环境决定
- 内置对象:由JS语言提供的对象;
- 固有对象:由标准规定,随着JS运行时创建而自动创建的对象实例
- 原生对象:可以由用户通过Array、RegExp等内置构造器或者特殊语法创建的对象
- 普通对象:由{}语法、Object构造器或者class关键字定义类创建的对象,它能够被原型继承
1、宿主对象
在浏览器环境中,我们都知道全局对象时window,window上又有很多属性,如document
宿主对象也分为固有的和用户可创建的两种,比如document.createElement就可以创建一些dom元素
宿主也会提供一些构造器,比如可以使用new Image来创建img元素。
2、内置对象-固有对象
固有对象在任何JS代码执行前就已经被创建出来了,他们通常扮演者类似基础库的角色。
ECMA标准为我们提供了一份固有对象表,里面含有150+个固有对象。附链接:https://www.ecma-international.org/ecma-262/9.0/index.html#sec-well-known-intrinsic-objects
3、内置对象-原生对象
在JS标准中,提供了30+个构造器,按照不同的应用场景,可以分为以下几类:
原生对象.png
通过这些构造器,可以用new运算创建新的对象,几乎所有这些构造器的能力都是无法用纯JS代码实现的,它们也无法用class/extend语法来继承。
用对象来模拟函数与构造器:函数对象与构造器对象
事实上,JS为这一类对象预留了私有字段机制,并规定了抽象的函数对象与构造器对象的概念。
函数对象的定义是:具有call
私有字段的对象;
构造器对象的定义是:具有私有字段construct
的对象
值得一提的是,在ES6之后 => 语法创建的函数仅仅是函数,它们无法被当作构造器使用,如代码:
new (a => 0) // error
对于用户使用function语法或者Function构造器创建的对象来说,call
和construct
行为总是相似的,如:
function f(){
return 1;
}
var v = f(); // 把 f 作为函数调用
var o = new f(); // 把 f 作为构造器调用
可以大致认为construct
的执行过程如下
- 以Object.prototype为原型创建一个新对象;
- 以新对象为this,执行函数的
call
; - 如果
call
的返回值是对象,那么,返回这个对象,否则返回第一步创建的新对象
这个规则会造成一个现象,如果构造器返回了一个新的对象,那么new创建的新对象就变成了一个构造函数之外完全无法访问的对象,一定程度上可以实现”私有“
function cls(){
this.a = 100;
return {
getValue:() => this.a
}
}
var o = new cls;
o.getValue(); //100
//a 在外面永远无法访问到
网友评论