【JavaScript】——“重学前端”04对象——对象的分类

JavaScript 中的对象分类:

宿主对象(host Objects):由 JavaScript 宿主环境提供的对象,它们的行为完全由宿主环境决定。
内置对象(Built-in Objects):由 JavaScript 语言提供的对象。
固有对象(Intrinsic Objects ):由标准规定,随着 JavaScript 运行时创建而自动创建的对象实例。
原生对象(Native Objects):可以由用户通过 Array、RegExp 等内置构造器或者特殊语法创建的对象。
普通对象(Ordinary Objects):由{}语法、Object 构造器或者 class 关键字定义类创建的对象,它能够被原型继承。

宿主对象:

浏览器环境中,我们都知道全局对象是 window,window 上又有很多属性,如document。

全局对象 window 上的属性,一部分来自 JavaScript 语言一部分来自浏览器环境


宿主对象也分为固有的用户可创建的两种,比如 document.createElement 就可以创建一些 dom 对象。
宿主也会提供一些构造器,比如我们可以使用 new Image 来创建 img 元素。

内置对象·固有对象:

固有对象是由标准规定,随着 JavaScript 运行时创建而自动创建的对象实例。
固有对象在任何 JS 代码执行前就已经被创建出来了,它们通常扮演者类似基础库的角色。我们前面提到的“类”其实就是固有对象的一种。

内置对象·原生对象:

把 JavaScript 中,能够通过语言本身的构造器创建的对象称作原生对象。

按照不同应用场景,把原生对象分成了以下几个种类。

 通过这些构造器,我们可以用 new 运算创建新的对象,所以我们把这些对象称作原生对象。

几乎所有这些构造器的能力都是无法用纯 JavaScript 代码实现的,它们也无法用class/extend 语法来继承。所以,我们可以认为,所有这些原生对象都是为了特定能力或者性能,而设计出来的“特权对象”。

用对象来模拟函数和构造器:

任何对象只需要实现 [[call]],它就是一个函数对象,可以去作为函数被调用。

而如果它能实现 [[construct]],它就是一个构造器对象,可以作为构造器被调用。

用户用 function 关键字创建的函数必定同时是函数和构造器。不过,它们表现出
来的行为效果却并不相同

对于宿主和内置对象来说,它们实现 [[call]](作为函数被调用)和 [[construct]](作为构
造器被调用)不总是一致的。

//内置对象 Date 在作为构造器调用时产生新的对象,作为函数时,则产生字符串
 console.log(new Date); // 1
 console.log(Date()); //Tue Dec 06 2022 08:47:16 GMT+0800 (中国标准时间)
//浏览器宿主环境中,提供的 Image 构造器,则根本不允许被作为函数调用。
console.log(new Image); // <img>
console.log(Image());// 抛出错误

再比如基本类型(String、Number、Boolean),它们的构造器被当作函数调用,则产生类型转换的效果。


对于用户使用 function 语法或者 Function 构造器创建的对象来说,[[call]] 和[[construct]] 行为总是相似的,它们执行同一段代码。

function f(){
 return 1;
}
var v = f(); // 把 f 作为函数调用
var o = new f(); // 把 f 作为构造器调用

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

它们常见的下标运算(就是使用中括号或者点来做属性访问)或者设置原型跟普通对象不同:

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

猜你喜欢

转载自blog.csdn.net/qq_50497708/article/details/128181580