JavaScript的原型与对象

JavaScript的原型

JavaScript这个名词最初就是因为Java太火了,为了蹭Java的热度所以起的名字,并且JavaScript的管理层要求它去模仿Java,所以他有很多地方跟Java相像,但是因为他们的设计不一样,所以在我学习的时候会有很多迷惑的地方,比如这里原型的概念。

Java、C++这一类的语言属于基于类的编程语言。这种类型的编程语言关注分类和类之间关系的开发模型,在这种语言中,总是先有类,再通过类实例化一个对象,类之间可以有继承,组合之类的关系。

JavaScript是属于基于原型的编程语言,更加关注对象实例的行为,是通过"复制操作"创建一个新对象。并不是真正的去复制一个原型对象,而是使新对象持有一个原型的引用。

抛去模拟Java类的操作语法(new、Function Object等),JavaScript的原型系统可以简单的来说就是对象的私有字段[[prototype]]就是对象的原型,读取一个属性,如果对象本身没有,就会访问对象的原型,直到找到或者原型为空为止。

在ES6之后,我们可以通过一些内置函数来才操纵原型:

  • Object.create 根据指定的原型创建新对象
  • Object.getPrototypeOf 获得一个对象的原型
  • Object.setPrototypeOf 设置一个对象的原型

JavaScript的对象

可以分为这么几类

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

宿主对象

宿主对象(Host Objects)是指由宿主环境(如浏览器或Node.js)提供的对象。这些对象不是ECMAScript规范中定义的对象,而是由特定的宿主环境定义和提供的。因此,宿主对象的特性和行为可能会有所不同,取决于它们所嵌入的环境。

  1. 浏览器环境中的宿主对象:

    • Window对象: 表示浏览器窗口或标签页。全局作用域中的变量和函数都是Window对象的属性和方法。
    • Document对象: 表示HTML文档,提供对文档内容的访问和操作。
    • Navigator对象: 提供有关浏览器的信息,如用户代理字符串等。
    • XMLHttpRequest对象: 用于在后台与服务器交换数据,是AJAX操作的基础。
    • Event对象: 表示事件,例如鼠标点击或键盘按键。
  2. Node.js环境中的宿主对象:

    • Global对象: 在Node.js中代表全局命名空间,类似于浏览器环境中的Window对象。
    • Process对象: 提供与当前进程相关的信息和控制。
    • Buffer对象: 用于处理二进制数据。
    • Module对象: 表示模块,用于导出和导入模块中的内容。

内置对象

是指由语言规范定义的对象,这些对象在任何支持JavaScript的环境中都是可用的。

固有对象

在JavaScript中,固有对象(Intrinsic Objects)是指与JavaScript语言紧密相关、由JavaScript引擎提供并在所有环境中可用的对象。这些对象直接由JavaScript引擎实现,而不是由宿主环境(如浏览器或Node.js)提供。固有对象通常是ECMAScript规范的一部分,因此在所有JavaScript环境中都是一致的。

以下是一些常见的固有对象及其一些基本方法的简单表格表示:

对象 描述 一些方法
Object 所有对象的基础,包括一些基本的对象操作方法。 Object.create(), Object.defineProperty()
Function 表示JavaScript中的函数。 Function.prototype.call(), Function.prototype.apply()
Array 用于表示数组。 Array.prototype.forEach(), Array.prototype.map()
String 用于表示字符串。 String.prototype.length, String.prototype.indexOf()
Boolean 表示布尔值。 -
Number 表示数字。 Number.prototype.toFixed(), Number.prototype.toString()
Symbol 表示唯一的标识符。 -
Error 表示运行时错误的基础对象。 Error.prototype.message, Error.prototype.stack
RegExp 表示正则表达式。 RegExp.prototype.test(), RegExp.prototype.exec()
Date 用于处理日期和时间。 Date.prototype.getDate(), Date.prototype.setTime()

原生对象

指的是由语言规范定义的内置对象和用户定义的对象,这两者都是由 JavaScript 本身提供的。与"宿主对象"不同,原生对象并不依赖于宿主环境,它们是 JavaScript 语言本身的一部分。

原生对象包括 ECMAScript 规范中定义的内置对象(如 Array、Object、Function 等)以及用户在代码中创建的对象。

  1. 内置对象: 上面举了一些例子

  2. 用户定义的对象:

    • 自定义构造函数: 可以使用构造函数创建自定义对象。例如,通过构造函数可以创建具有特定属性和方法的对象。
    js 复制代码
    function Person(name, age) {
      this.name = name;
      this.age = age;
    }
    
    const person1 = new Person("Alice", 25);
    • 字面量方式创建对象: 使用对象字面量 {} 可以直接创建对象。
    js 复制代码
    const car = {
      brand: "Toyota",
      model: "Camry",
      year: 2022,
    };

普通对象

是 JavaScript 中最基本、最常见的对象类型之一。它们是由对象字面量({})或 Object 构造函数创建的对象。普通对象不属于特殊的对象类型(如数组、函数、正则表达式等),而是用于存储键值对的一般用途对象。

创建普通对象的方式有两种:

  • 对象字面量: 使用花括号 {} 直接创建对象。
js 复制代码
const person = {
    name: "John",
    age: 30,
    job: "Developer"
};
  • Object 构造函数: 使用 new Object() 构造函数创建对象。
js 复制代码
const person = new Object();
person.name = "John";
person.age = 30;
person.job = "Developer";
相关推荐
小马哥编程35 分钟前
Function.prototype和Object.prototype 的区别
javascript
小白学前端66636 分钟前
React Router 深入指南:从入门到进阶
前端·react.js·react
web130933203981 小时前
前端下载后端文件流,文件可以下载,但是打不开,显示“文件已损坏”的问题分析与解决方案
前端
王小王和他的小伙伴1 小时前
解决 vue3 中 echarts图表在el-dialog中显示问题
javascript·vue.js·echarts
学前端的小朱1 小时前
处理字体图标、js、html及其他资源
开发语言·javascript·webpack·html·打包工具
outstanding木槿1 小时前
react+antd的Table组件编辑单元格
前端·javascript·react.js·前端框架
好名字08212 小时前
前端取Content-Disposition中的filename字段与解码(vue)
前端·javascript·vue.js·前端框架
摇光932 小时前
js高阶-async与事件循环
开发语言·javascript·事件循环·宏任务·微任务
隐形喷火龙2 小时前
element ui--下拉根据拼音首字母过滤
前端·vue.js·ui
m0_748241122 小时前
Selenium之Web元素定位
前端·selenium·测试工具