返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript中Function与Object的关系
  • 273
分享到

JavaScript中Function与Object的关系

JavaScriptFunctionObject 2023-05-18 20:05:24 273人浏览 八月长安
摘要

目录原型链我们来回顾一下什么是原型然后是原型链关于原型链一些有意思的东西最后是关于new关键字原型链 我们来回顾一下什么是原型 我们知道js中所有的对象、函数、数组都可以看成对象,也

原型链

我们来回顾一下什么是原型

  • 我们知道js中所有的对象、函数、数组都可以看成对象,也就是一切皆是对象

  • 所有的对象身上都有一个__proto__属性,他叫隐式原型,指向了构造这个对象(如obj)的构造函数(例如Constructor)的原型对象即Constructor.prototype,也就是说obj.__proto__===Constructor.prototype,这两个指针指向的其实是同一块堆空间

  • 在构造函数的原型对象prototype(Constructor.prototype)中,一般包含constructor属性和__proto__属性。

  • 其中constructor包含函数的一些信息如argmentscallerlengthname 和prototype指向构造函数的原型对象自身以及__scope__即闭包属性(其中有函数需要使用的外部变量以及全局上下文,以伪数组的形式储存在scope闭包对象中),另外__proto__的话,其实就是把Constructor.prototype看成new出来的对象实例,__proto__就是指向Constructor.prototype的构造函数(如Superconstructor)的实例对象即Superconstructor.prototype

  • 具体可以参照下图:

然后是原型链

  • 由于对象(如obj)的隐式原型(obj.__proto__)指向构造函数的prototype(如Constructor.prototype),

  • 而这个prototype(如Constructor.prototype)里面又有一个__proto__,它指向了prototype的构造函数的prototype(如Superconstructor.prototype),

  • 然后Superconstructor.prototype.__proto__指向了Object.prototype

  • 这样就形成了一个简单的链式结构,这个条链的最后是Object.prototype.__proto__为null

以上就是原型链的构成

原型链的使用

当你使用一个对象的属性或方法时,会先在该对象上查找已有属性,如果没有,就找到__proto__,找原型身上的属性,如果原型没有,那就再找原型的原型身上是否存在待查找属性,知道找到或者找到原型链的顶端null

关于原型链一些有意思的东西

我们知道typeof可以用于判断变量的数据类型,但是对于复杂数据类型,它只能判断出对象、数组或函数,这对于我们的使用来说是不够的

所以我们可以用instanceof来判断引用数据类型的对象类型

typeof A //'function'
obj instanceof A //true
obj instanceof Object //true

在使用时我发现一个有趣的问题

Function instanceof Object //true
Object instanceof Function //true

这是为什么呢?

我们尝试使用

Function.__proto__===Object.prototype //false

发现得到的是false,也就是Function并不是Object new出来的

但是尝试

Object.__proto__===Function.prototype //true

却发现Object是由Function new出来的

接着我们分析一下instanceof的工作原理, 我们尝试用函数instance_of来手写instanceof关键字

function instance_of(L, R) {
    var O = R.prototype; 
    L = L.__proto__;
    while (true) {    
        if (L === null)      
             return false;   
        if (O === L) 
             return true;   
        L = L.__proto__;  
    }
}

对于以上代码分析,我们其实是在找左值的原型链上是否存在右值的原型

于是我们尝试

Function.__proto__===Function.prototype //true
Function.__proto__.__proto__===Object.prototype //true

发现原来Function.prototype是由Object new出来的,同时Function也是可以由自己new出来

  • 综上,FunctionFunction new出来ObjectFunction new出来,Function.prototypeObject new出来

最后是关于new关键字

当代码 new Foo(...) 执行时,会发生以下事情:

  • 一个继承自 Foo.prototype 的新对象被创建(类似于Object.create)。
  • 使用指定的参数调用构造函数 Foo,并将 this 绑定到新创建的对象。new Foo不带括号就是没有指定参数列表,Foo 不带任何参数调用。
  • 由构造函数返回对象,作为 new 表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤 1 创建的对象。(一般情况下,构造函数不返回值,但是可以选择主动返回对象,来覆盖正常的对象创建步骤)

尝试用newFun手写new关键字

function newFun(Constructor) {
    var obj = {};
    obj.__proto__ = Constructor.prototype;
    return Constructor.apply(obj);    
};

使用Object.create

function newFun() {
    Constructor = [].shift.call(arguments);// 取出第一个参数Constructor
    var obj = Object.create(Constructor);    
    return Constructor.apply(obj, arguments);// 使用参数调用
};
  • 补充一点题外话
    let a = {
        k:10,
        hh(){
            console.log(this);
        }
    }
    let b = {
        k:9,
        a
    }
    b.a.hh();
    使用对象链式调用hh()函数,它的this指向通过隐式绑定还是指向直接调用它的对象a,而不是间接调用的对象b

到此这篇关于javascript中Function与Object的关系的文章就介绍到这了,更多相关JavaScript Function Object内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript中Function与Object的关系

本文链接: https://lsjlt.com/news/212371.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript中Function与Object的关系
    目录原型链我们来回顾一下什么是原型然后是原型链关于原型链一些有意思的东西最后是关于new关键字原型链 我们来回顾一下什么是原型 我们知道js中所有的对象、函数、数组都可以看成对象,也...
    99+
    2023-05-18
    JavaScript Function Object
  • java中基本数据类型与Object的关系说明
    目录基本数据类型与Object的关系这里举一个例子Object、基本数据类型的包装类Object类基本数据类型基本数据类型与Object的关系 我知道大家是不是都听说过Object是...
    99+
    2024-04-02
  • JavaScript中Map与Object应用场景
    目录引言为什么 Object 缺少哈希映射不需要的继承名称冲突尺寸迭代清除检查属性是否存在哈希映射的映射性能基准测试实施细节字符串键整数键数字键内存使用情况结论浏览器兼容性注意事项引...
    99+
    2024-04-02
  • java中基本数据类型与Object的关系是什么
    这篇文章给大家分享的是有关java中基本数据类型与Object的关系是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。基本数据类型与Object的关系我知道大家是不是都听说过Object是所有类型的基类,但是这...
    99+
    2023-06-29
  • javascript与html有啥关系
    JavaScript与HTML有何关系?HTML(Hypertext Markup Language)是一种基本的互联网标记语言,用于创建静态网页并在网页上展示内容。而JavaScript是一种动态解释性编程语言,可用于创建动态网站和交互式...
    99+
    2023-05-21
  • JavaScript与dom的关系是什么
    这篇文章主要讲解了“JavaScript与dom的关系是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript与dom的关系是什么”吧! ...
    99+
    2024-04-02
  • javascript中function指的是什么
    这篇文章主要介绍了javascript中function指的是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 ...
    99+
    2024-04-02
  • javascript中的function怎么使用
    这篇“javascript中的function怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来...
    99+
    2024-04-02
  • java与javascript有没有关系
    这篇文章主要介绍了java与javascript有没有关系,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 jav...
    99+
    2024-04-02
  • JavaScript中function的作用有哪些
    JavaScript中function的作用有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。语义1:作为构造器的 function1234...
    99+
    2024-04-02
  • 简单了解JavaScript中的new Function
    目录前言1、语法01).无效的 JSON 对象字符串合法化02).模板字符串作为模板前言 JavaScript技术一直处于不断发展壮大中,如果你是前端开发人员或者JavaScript...
    99+
    2024-04-02
  • JavaScript中$(function(){})写法的示例分析
    小编给大家分享一下JavaScript中$(function(){})写法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!$(function(){})写...
    99+
    2023-06-03
  • JavaScript中的Object介绍及作用
    本篇内容介绍了“JavaScript中的Object介绍及作用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • javascript与java有什么关系(区别与相似)
    目录什么是Java?如何开始用 Java 编写代码用Java编写一个简单的代码代码说明什么是 JavaScript?如何开始使用 JavaScript 编写代码如何编写你的第一个Ja...
    99+
    2023-02-25
    javascript与java有什么关系 javascript与java区别与相似
  • JavaScript中Object的常用方法总结
    目录1、Object.keys方法2、Object.values()方法3、Object.create()4、Object.hasOwnProperty()方法5、Object.ge...
    99+
    2023-02-10
    JavaScript Object常用方法 JavaScript Object方法 JavaScript Object
  • ASP、Path、JavaScript与日志有什么关系?
    在Web开发中,我们常常需要使用ASP、Path、JavaScript等技术来实现网站的功能和交互效果。同时,为了更好地了解用户行为和网站运行状态,我们还需要记录日志。那么ASP、Path、JavaScript与日志之间有什么关系呢?下面...
    99+
    2023-07-02
    path javascript 日志
  • JavaScript中Function对象语法的实例用法
    本篇内容主要讲解“JavaScript中Function对象语法的实例用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript中Function对...
    99+
    2024-04-02
  • php中function关键字的用法是什么
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑PHP 的函数可以分为两种,即 PHP 的预定义函数和用户自定义的函数。用户可以在自己的程序或 PHP 文件中直接使用预定义函数,PHP 提供了大量功能丰富的预定义函数...
    99+
    2018-01-13
    php function 关键字
  • Java 中 hashCode() 与 equals() 的关系(面试)
    目录一.基础:hashCode() 和 equals() 简介equals()hashCode()二. 漫谈:初识 hashCode() 与 equals() 之间的关系三. 解密:...
    99+
    2024-04-02
  • Thinkphp6中验证码与session的关系
    这篇“Thinkphp6中验证码与session的关系”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“Thinkphp6中验证码与session的关系”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,...
    99+
    2023-06-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作