重学前端 9 # JavaScript中的对象分类

简介: 重学前端 9 # JavaScript中的对象分类

一、javaScript对象分类介绍


1.0、宿主对象(host Objects)

由 JavaScript 宿主环境提供的对象,它们的行为完全由宿主环境决定。


1.1、内置对象(Built-in Objects)

由 JavaScript 语言提供的对象。


1.1.0、固有对象(Intrinsic Objects )

由标准规定,随着 JavaScript 运行时创建而自动创建的对象实例。


1.1.1、原生对象(Native Objects)

可以由用户通过 Array、RegExp 等内置构造器或者特殊语法创建的对象。


1.1.2、普通对象(Ordinary Objects)

{} 语法、Object 构造器或者 class 关键字定义类创建的对象,它能够被原型继承。

下面winter主要介绍了普通对象之外的对象原型(刚好都是我不太懂的,mark一下)




二、宿主对象


2.0、window对象


  • 全局对象 window 上的属性,一部分来自 JavaScript 语言,一部分来自浏览器环境
  • 宿主也会提供一些构造器,比如使用 new Image来创建 img 元素(winter下次会讲浏览器的API,到时再详细的mark一下)




三、内置对象·固有对象


3.0、简单介绍

  • 固有对象在任何 JS 代码执行前就已经被创建出来,类似基础库的角色
  • ECMA 标准为我们提供了一份固有对象表,里面含有 150+ 个固有对象(链接打开比较慢,稍等一下就好)


3.1、小实验:获取全部 JavaScript 固有对象


3.1.0、三个值

Infinity、NaN、undefined


3.1.1、九个函数

eval、isFinite、isNaN、parseFloat、parseInt、decodeURI decodeURIComponent、encodeURI、encodeURIComponent


3.1.2、一些构造器

   Array、Date、RegExp、Promise、Proxy、Map、WeakMap、Set、WeapSet、Function、Boolean、String、Number、Symbol、Object、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError URIError、ArrayBuffer、SharedArrayBuffer、DataView、Typed Array、Float32Array、Float64Array、Int8Array、Int16Array、Int32Array、UInt8Array、UInt16Array、UInt32Array、UInt8ClampedArray


3.1.3、四个用于当作命名空间的对象

Atomics、JSON、Math、Reflect


3.1.4、处理方法

1、winter的做法:使用广度优先搜索,查找这些对象所有的属性和 Getter/Setter,就可以获得 JavaScript 中所有的固有对象。


2、下面代码可以研究一下看看,new Set()不懂的可以看看MDN关于set的介绍,(我现在还没有看明白,我去不同网页打开运行输出set不一样,感觉有点懵逼_(:3」∠)_,理解的大佬可以留言告诉我,不胜感激)

var set = new Set();
var objects = [
    eval,
    isFinite,
    isNaN,
    parseFloat,
    parseInt,
    decodeURI,
    decodeURIComponent,
    encodeURI,
    encodeURIComponent,
    Array,
    Date,
    RegExp,
    Promise,
    Proxy,
    Map,
    WeakMap,
    Set,
    WeakSet,
    Function,
    Boolean,
    String,
    Number,
    Symbol,
    Object,
    Error,
    EvalError,
    RangeError,
    ReferenceError,
    SyntaxError,
    TypeError,
    URIError,
    ArrayBuffer,
    SharedArrayBuffer,
    DataView,
    Float32Array,
    Float64Array,
    Int8Array,
    Int16Array,
    Int32Array,
    Uint8Array,
    Uint16Array,
    Uint32Array,
    Uint8ClampedArray,
    Atomics,
    JSON,
    Math,
    Reflect];
objects.forEach(o => set.add(o));
for(var i = 0; i < objects.length; i++) {
    var o = objects[i]
    for(var p of Object.getOwnPropertyNames(o)) {
        var d = Object.getOwnPropertyDescriptor(o, p)
        if( (d.value !== null && typeof d.value === "object") || (typeof d.value === "function"))
            if(!set.has(d.value))
                set.add(d.value), objects.push(d.value);
        if( d.get )
            if(!set.has(d.get))
                set.add(d.get), objects.push(d.get);
        if( d.set )
            if(!set.has(d.set))
                set.add(d.set), objects.push(d.set);
    }
}




四、内置对象·原生对象


4.0、分类

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


9265118d442fd212a6a38a5ade1b1800.png


4.1、注意的几个点


   可以用 new 运算创建新的对象

   几乎所有这些构造器的能力都是无法用纯 JavaScript 代码实现

   也无法用 class/extend 语法来继承

   创建的对象多数使用了私有字段,比如:Error: [[ErrorData]]…这些字段使得原型继承方法无法正常工作

   所有这些原生对象都是为了特定能力或者性能,而设计出来的特权对象



五、用对象来模拟函数与构造器:函数对象与构造器对象


5.0、函数对象的定义

具有 [[call]] 私有字段的对象


[[call]] 私有字段必须是一个引擎中定义的函数,需要接受 this 值和调用参数,并且会产生域的切换



5.1、构造器对象的定义


具有 [[construct]] 私有字段的对象


5.1.0、[[construct]] 的大致执行过程

1、以 Object.protoype 为原型创建一个新对象

2、以新对象为 this,执行函数的 [[call]]

3、如果 [[call]] 的返回值是对象,那么,否则返回第一步创建的新对象



5.2、例子

1、内置对象 Date 在作为构造器调用时产生新的对象,作为函数时,则产生字符串,见以下代码:

console.log(new Date);
console.log(Date())


2、浏览器宿主环境中,提供的 Image 构造器,则根本不允许被作为函数调用。

console.log(new Image);
console.log(Image()); // 抛出错误 Uncaught TypeError: Failed to construct 'Image': Please use the 'new' operator, this DOM object constructor cannot be called as a function.'Image'


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


4、在 ES6 之后 => 语法创建的函数仅仅是函数,它们无法被当作构造器使用,见以下代码:

new (a => 0) // 报错:Uncaught TypeError: (intermediate value) is not a constructor

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

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


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

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




六、特殊行为的对象


6.0、行为不大一样的对象

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


Array:Array 的 length 属性根据最大的下标自动发生变化。


Object.prototype:作为所有正常对象的默认原型,不能再给它设置原型了。


String:为了支持下标运算,String 的正整数属性访问会去字符串里查找。


Arguments:arguments 的非负整数型下标属性跟对应的变量联动。


模块的 namespace 对象:特殊的地方非常多,跟一般对象完全不一样,尽量只用于 import


类型数组和数组缓冲区:跟内存块相关联,下标运算比较特殊


bind 后的 function:跟原来的函数相关联



目录
相关文章
|
8天前
|
JavaScript 前端开发
如何在 JavaScript 中使用 __proto__ 实现对象的继承?
使用`__proto__`实现对象继承时需要注意原型链的完整性和属性方法的正确继承,避免出现意外的行为和错误。同时,在现代JavaScript中,也可以使用`class`和`extends`关键字来实现更简洁和直观的继承语法,但理解基于`__proto__`的继承方式对于深入理解JavaScript的面向对象编程和原型链机制仍然具有重要意义。
|
12天前
|
Web App开发 JavaScript 前端开发
如何确保 Math 对象的方法在不同的 JavaScript 环境中具有一致的精度?
【10月更文挑战第29天】通过遵循标准和最佳实践、采用固定精度计算、进行全面的测试与验证、避免隐式类型转换以及持续关注和更新等方法,可以在很大程度上确保Math对象的方法在不同的JavaScript环境中具有一致的精度,从而提高代码的可靠性和可移植性。
|
4天前
|
资源调度 前端开发 JavaScript
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第10天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤,包括安装依赖、创建混淆脚本、修改 `package.json` 脚本命令、构建项目并执行混淆,以及在 HTML 文件中引用混淆后的文件。通过这些步骤,可以有效提高代码的安全性。
|
12天前
|
设计模式 前端开发 JavaScript
揭秘!前端大牛们如何巧妙利用JavaScript,打造智能交互体验!
【10月更文挑战第30天】前端开发领域充满了无限可能与创意,JavaScript作为核心语言,凭借强大的功能和灵活性,成为打造智能交互体验的重要工具。本文介绍前端大牛如何利用JavaScript实现平滑滚动、复杂动画、实时数据更新和智能表单验证等效果,展示了JavaScript的多样性和强大能力。
30 4
|
10天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
10天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
17 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
12天前
|
JavaScript 前端开发 图形学
JavaScript 中 Math 对象常用方法
【10月更文挑战第29天】JavaScript中的Math对象提供了丰富多样的数学方法,涵盖了基本数学运算、幂运算、开方、随机数生成、极值获取以及三角函数等多个方面,为各种数学相关的计算和处理提供了强大的支持,是JavaScript编程中不可或缺的一部分。
|
15天前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
21 1
|
16天前
|
JavaScript 前端开发 API
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第26天】前端技术的飞速发展让开发者在构建用户界面时有了更多选择。本文对比了Vue.js和Angular两大框架,介绍了它们的特点和优劣,并给出了在实际项目中如何选择的建议。Vue.js轻量级、易上手,适合小型项目;Angular结构化、功能强大,适合大型项目。
16 1
|
23天前
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。