首页 > 其他分享 >Function.prototype和Object.prototype 的区别

Function.prototype和Object.prototype 的区别

时间:2024-12-29 12:26:32浏览次数:3  
标签:Function 函数 对象 Object 原型 prototype

Function.prototypeObject.prototype 都是 JavaScript 中的重要原型对象,它们分别用于所有函数对象和所有普通对象的原型链。它们有很多不同之处,主要体现在它们所代表的对象类型和功能上。

1. 作用域和对象类型

  • Object.prototype 是所有普通 JavaScript 对象的原型。

    • 任何通过 object 构造器(如 new Object())或字面量(如 {})创建的对象都继承自 Object.prototype
    • Object.prototype 上定义了许多通用的属性和方法,比如 toString()hasOwnProperty()valueOf() 等。
  • Function.prototype 是所有函数对象的原型。

    • 任何通过 function 关键字声明的函数,或通过 new Function() 构造的函数,都会继承自 Function.prototype
    • Function.prototype 上定义了与函数相关的方法,如 call()apply()bind() 等。

2. 原型链的区别

  • Object.prototype 是最顶层的原型

    • 所有普通对象(包括数组、日期对象等)最终都继承自 Object.prototype,并且它位于原型链的最顶端。
    • Object.prototype 本身没有继承其他对象,它是原型链的“根”。
  • Function.prototype 继承自 Object.prototype

    • 所有函数对象都继承自 Function.prototype,因此,Function.prototype 上的方法可以被所有函数使用。
    • 同时,Function.prototype 也继承了 Object.prototype,这意味着函数也可以访问 Object.prototype 上的方法。

3. 核心属性和方法的区别

  • Object.prototype 的常见属性和方法

    • toString(): 返回对象的字符串表示。
    • hasOwnProperty(): 检查对象是否拥有某个自有属性。
    • valueOf(): 返回对象的原始值。
    • constructor: 指向创建该对象的构造函数。
  • Function.prototype 的常见属性和方法

    • call(): 用于调用函数,并指定 this 上下文和传入的参数。
    • apply(): 与 call() 类似,不过 apply() 接受参数是一个数组。
    • bind(): 创建一个新的函数,绑定指定的 this 值和初始参数。
    • constructor: 指向 Function 构造函数。

4. 构造器和实例的关系

  • Object.prototype 是普通对象的构造器原型。所有对象的 __proto__ 链接最终都会指向 Object.prototype。因此,你可以通过对象访问到 Object.prototype 上的方法。

    • 例如:
      const obj = {};
      console.log(obj.__proto__ === Object.prototype); // true
      
  • Function.prototype 是函数对象的构造器原型。所有函数对象的 __proto__ 链接最终指向 Function.prototype

    • 例如:
      function foo() {}
      console.log(foo.__proto__ === Function.prototype); // true
      

5. 总结

特性Object.prototypeFunction.prototype
作用所有对象的原型所有函数对象的原型
继承关系是原型链的最顶层,没有继承其他对象继承自 Object.prototype
主要方法toString(), hasOwnProperty(), valueOf()call(), apply(), bind(), constructor
构造器所有普通对象(如 {})的构造器原型所有函数(如通过 function 关键字声明的)构造器原型

例子

// 1. `Object.prototype`
const obj = {};
console.log(obj.hasOwnProperty('toString')); // true
console.log(obj.toString()); // '[object Object]'
console.log(obj.constructor === Object); // true

// 2. `Function.prototype`
function myFunction() {}
console.log(myFunction.call); // function call()
console.log(myFunction instanceof Function); // true
console.log(myFunction.constructor === Function); // true

总结

  • Object.prototype 是所有对象的原型,提供了与对象相关的通用方法。
  • Function.prototype 是所有函数的原型,提供了与函数执行相关的专用方法,同时继承自 Object.prototype,因此函数也能访问对象的一些通用方法。

这两者各自有不同的角色和功能,分别用于对象和函数类型的原型链。

标签:Function,函数,对象,Object,原型,prototype
From: https://blog.csdn.net/qq_41413652/article/details/144712248

相关文章

  • 请手动实现Array.prototype.reduce的方法
    Array.prototype.reduce方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。以下是一个手动实现的reduce方法的示例:Array.prototype.myReduce=function(callback,initialValue){//如果没有提供初始值,则将数组的第一个元素作为初始......
  • 鸿蒙开发(25)@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化
    之前所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型。对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第二层的属性变化是无法观察到的。这就引出了@Observed/@ObjectLink装饰器。概述@Object......
  • C++中for (int i; i<track_object.region_num; i++)这样写没有对i进行初始化0也不会报
    在C++中,未初始化的局部变量(如 inti)会包含未定义的值,可能导致未定义行为(undefinedbehavior,UB)。对于以下代码:for(inti;i<track_object.region_num;i++){//Loopbody}i 没有显式初始化,因此它的初始值是未定义的。然而,你观察到代码运行时没有报错的原因可能......
  • nom::sequence::preceded Matches an object from the first parser and discards it,
    nom::sequence::precededMatchesanobjectfromthefirstparseranddiscardsit,thengetsanobjectfromthesecondparser.上面是rustnom官网对于preceded的解释UUUUUUUUU你完全正确,nom::sequence::preceded的定义确实是:Matchesanobjectfromthefirstparse......
  • CDS标准视图:功能位置 I_FunctionalLocation
    视图名称:I_FunctionalLocation视图类型:基础视图代码:点击查看代码@EndUserText.label:'FunctionalLocation'@Analytics:{dataCategory:#DIMENSION}@VDM.viewType:#BASIC@AbapCatalog:{sqlViewName:'IFUNCTLLOCATION',compiler.compareFilter,preserveK......
  • 【Pandas】pandas Series infer_objects
    Pandas2.2SeriesConversion方法描述Series.astype用于将Series对象的数据类型转换为指定类型的方法Series.convert_dtypes用于将Series对象的数据类型智能地转换为最佳可能的数据类型的方法Series.infer_objects用于尝试推断Series中对象(object)数据类型列的最佳数据......
  • Object.assign()是浅拷贝还是深拷贝?
    Object.assign()在JavaScript中是执行浅拷贝(shallowcopy)的。这意味着,它只复制对象的顶层属性和值。如果对象的属性值是一个引用类型(例如,数组或另一个对象),Object.assign()不会复制这个引用类型的实际内容,而是复制这个引用本身。因此,原对象和新对象会共享这个引用,对一个对象的......
  • 【Unity架构插件】Soap 是一款基于 ScriptableObject 模式的 Unity 插件,旨在通过采用
    Soap是一款基于ScriptableObject模式的Unity插件,旨在通过采用一种清晰且模块化的架构模式,简化项目中的数据管理、事件处理和跨模块的通信。Soap提供了一个轻量级、易于扩展和维护的解决方案,帮助开发者在Unity项目中实现更高效、更清晰的代码结构。主要特点Scriptab......
  • error while loading shared libraries: libncurses.so.5: cannot open shared object
    第一个错误:errorwhileloadingsharedlibraries:libncurses.so.5:cannotopensharedobjectfile解决方法:该错误的原因是因为所依赖的libncurses.so版本问题,默认依赖的版本是libncurses.so.5,但是系统上libncurses.so的版本不是5导致的。可以在/usr/lib64文件夹下查找当......
  • Object中的方法
    静态方法Equals判断两个对象是否相等最终的判断全交给左侧对象的Equals方法不管是值类型还是引用类型都会按照左侧对象Equals方法的规则来进行比较ReferenceEquals比较两个对象是否是相同的引用,主要用来比较引用类型的对象值类型对象返回值始终是false成员方法GetType......