博客
关于我
重新认识原型和原型链二
阅读量:519 次
发布时间:2019-03-07

本文共 1974 字,大约阅读时间需要 6 分钟。

原型(Prototype)、proto 和 constructor 是 JavaScript 中非常重要的概念,了解它们对于理解对象创建和继承 mechanism 是必不可少的。今天我将带你深入探讨这些属性,并通过实例解释它们的作用。

1. 原型(Prototype)和 constructor 属性

原型(Prototype)是一个非常重要的概念,它既是原型属性也是原型对象。每个函数在定义时都带有 prototype 属性,而构造函数(如 User)的 prototype 属性包含常规方法和属性,这些方法和属性可以被所有该构造函数创建的实例共享和继承。

通过以下代码可以观察到这一点:

function User() {}console.log(User.prototype); // 输出: { constructor: (function User()), __proto__: Object }

这里可以看到, User 函数的 prototype 属性指向了一个对象,其中包含 constructor 属性。由于constructor 属性本身也是一个函数,它指向当前的 User 函数,这就形成了一个循环:

User.prototype.constructor = User; // 造成循环

constructors 的主要作用是什么?它为构造函数提供了一种方式,以便原型链上的方法能够正确地指向构造函数。虽然这一特性在现代 JavaScript 中不太常用,但了解它有助于理解原型机制的基础。

2. proto(隐式原型)

proto 是 JavaScript 中的隐式原型属性,它指向构造函数的显式原型(prototype)。简单来说,每个对象(甚至包括数据类型)都有一个 proto 属性,而这个属性会指向它的显式原型。如果没有显式指定,隐式原型会指向 Object 的原型。

例如:

function User() {}var user = new User();console.log(user.__proto__); // 输出: User.prototype

通过上述代码可以看出,用户对象的 proto 指向了 User 构造函数的显式原型。这种机制允许用户对象能够访问构造函数原型中定义的属性和方法。

3. 数据类型的隐式原型

除了对象,所有数据类型(包括 null 和 undefined 之外)都有自己的隐式原型。例如:

console.log(10.__proto__); // 输出: Number.prototypeconsole.log('10'.__proto__); // 输出: String.prototypeconsole.log(true.__proto__); // 输出: Boolean.prototypeconsole.log("{}).__proto__; // 输出: Object.prototype

这些隐式原型允许 JavaScript 实例能够访问与它们对应的数据类型相关的属性和方法。例如,数值对象可以通过 Number.prototype 方法获取到 to string 等方法。

4. 构造函数和实例对象

构造函数和实例对象之间的关系是通过原型链实现的。构造函数的显式原型(prototype)包含了一系列方法和属性,而实例对象的隐式原型(proto)则指向构造函数的显式原型。

例如:

function Date() {}var time = new Date();console.log(time.__proto__ === Date.prototype); // 输出: true

这一机制允许实例对象能继承构造函数原型中的方法和属性,从而实现代码复用和代码共享。

5. 特殊情况注意事项

  • null 和 undefined:这些值的 proto 属性是 undefined。
  • Object.prototype 没有构造函数:注意到,在 Object.prototype 中,构造函数是 Object(即 Object 构造函数)。
  • 数组和对象的原型链:数组和对象实例的 proto 指向不同的显式原型。

6. 结论

原型、proto 和 constructor 属性共同构成了 JavaScript 中对象的 inheritance mechanism。理解这些属性的作用有助于更好地理解 JavaScript 的对象模型,从而提高代码的维护性和可读性。在实际开发中,合理利用原型链可以显著提升代码性能,减少 memory leak。希望你对这些概念有了更深入的理解,欢迎继续探索 JavaScript 的其他奥秘。如果你有任何问题,欢迎在评论区与我交流。

转载地址:http://bhnnz.baihongyu.com/

你可能感兴趣的文章
m_Orchestrate learning system---二十二、html代码如何变的容易
查看>>
M×N 形状 numpy.ndarray 的滑动窗口
查看>>
m个苹果放入n个盘子问题
查看>>
n = 3 , while n , continue
查看>>
n 叉树后序遍历转换为链表问题的深入探讨
查看>>
N!
查看>>
N-Gram的基本原理
查看>>
n1 c语言程序,全国青少年软件编程等级考试C语言经典程序题10道七
查看>>
Nacos Client常用配置
查看>>
nacos config
查看>>
Nacos Config--服务配置
查看>>
Nacos Derby 远程命令执行漏洞(QVD-2024-26473)
查看>>
Nacos 与 Eureka、Zookeeper 和 Consul 等其他注册中心的区别
查看>>
Nacos 单机集群搭建及常用生产环境配置 | Spring Cloud 3
查看>>
Nacos 启动报错[db-load-error]load jdbc.properties error
查看>>
Nacos 报Statement cancelled due to timeout or client request
查看>>
Nacos 注册服务源码分析
查看>>
Nacos 融合 Spring Cloud,成为注册配置中心
查看>>
Nacos-注册中心
查看>>
Nacos2.X 源码分析:为订阅方推送、服务健康检查、集群数据同步、grpc客户端服务端初始化
查看>>