深入理解javascript原型和闭包(4)——隐式原型

注意:本文不是javascript基础教程,如果你没有接触过原型的基本知识,应该先去了解一下,推荐看《javascript高级程序设计(第三版)》第6章:面向对象的程序设计。

上节已经提到,每个函数function都有一个prototype,即原型。这里再加一句话——每个对象都有一个__proto__,可成为隐式原型。

这个__proto__是一个隐藏的属性,javascript不希望开发者用到这个属性值,有的低版本浏览器甚至不支持这个属性值。所以你在Visual Studio 2012这样很高级很智能的编辑器中,都不会有__proto__的智能提示,但是你不用管它,直接写出来就是了。

 

 

上面截图看来,obj.__proto__和Object.prototype的属性一样!这么巧!

答案就是一样。

obj这个对象本质上是被Object函数创建的,因此obj.__proto__=== Object.prototype。我们可以用一个图来表示。

 

即,每个对象都有一个__proto__属性,指向创建该对象的函数的prototype。

 

那么上图中的“Object prototype”也是一个对象,它的__proto__指向哪里?

好问题!

在说明“Object prototype”之前,先说一下自定义函数的prototype。自定义函数的prototype本质上就是和 var obj = {} 是一样的,都是被Object创建,所以它的__proto__指向的就是Object.prototype。

但是Object.prototype确实一个特例——它的__proto__指向的是null,切记切记!

 

还有——函数也是一种对象,函数也有__proto__吗?

又一个好问题!——当然有。

函数也不是从石头缝里蹦出来的,函数也是被创建出来的。谁创建了函数呢?——Function——注意这个大写的“F”。

且看如下代码。

以上代码中,第一种方式是比较传统的函数创建方式,第二种是用new Functoin创建。

首先根本不推荐用第二种方式

这里只是向大家演示,函数是被Function创建的。

 

好了,根据上面说的一句话——对象的__proto__指向的是创建它的函数的prototype,就会出现:Object.__proto__ === Function.prototype。用一个图来表示。

上图中,很明显的标出了:自定义函数Foo.__proto__指向Function.prototype,Object.__proto__指向Function.prototype,唉,怎么还有一个……Function.__proto__指向Function.prototype?这不成了循环引用了?

对!是一个环形结构。

其实稍微想一下就明白了。Function也是一个函数,函数是一种对象,也有__proto__属性。既然是函数,那么它一定是被Function创建。所以——Function是被自身创建的。所以它的__proto__指向了自身的Prototype。

 

篇幅不少了,估计也都看烦了。快结束了。

最后一个问题:Function.prototype指向的对象,它的__proto__是不是也指向Object.prototype?

答案是肯定的。因为Function.prototype指向的对象也是一个普通的被Object创建的对象,所以也遵循基本的规则。

 

OK 本节结束,是不是很乱?

乱很正常。那这一节就让它先乱着,下一节我们将请另一个老朋友来帮忙,把它理清楚。这位老朋友就是——instanceof。

具体内容,请看下节分解。

---------------------------------------------------------------------------

本文已更新到《深入理解javascript原型和闭包系列》的目录,更多内容可参见《深入理解javascript原型和闭包系列》。

另外,欢迎关注我的微博。

学习作者教程:《前端JS高级面试》《前端JS基础面试题》《React.js模拟大众点评webapp》《zepto设计与源码分析》《json2.js源码解读》

转载于:https://www.cnblogs.com/wangfupeng1988/p/3979290.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ecshop 手机版的php代码在哪里,PHP 在ecshop上集成 手机网页支付_php

参考alipay网页支付接口的代码其实原理跟ecshop上集成的alipay支付差不多 就是因为利用curl请求的时候相应时间过长 所以不能直接去先post数据再生成button/*** 生成支付代码* param array $order 订单信息* param array $payment 支付方式信息*/function get…

技术回归本位:海尔引领空调产业重构格局

当前,互联网新思维方式日趋侵染,越来越多的细分领域在“互联网”理念下纷纷尝试跨界探索新的创新,一些商家除了推出全新战略型产品和服务之外,还在主打营销概念争夺舆论风口方面投入了巨大的精力与资源。在这种以理念为中心的时代…

护肤

选择什么 护肤品 2222选择什么 1氨基酸洗面奶&#xff1a;去油控油能力适中&#xff0c;用完皮肤清爽&#xff0c;比较亲和&#xff0c;一般成分里多次出现“氨酸”这两个字的就是氨基酸洗面奶&#xff0c;这种洗面奶适合长期使用.</p><p><b>皀基洗面奶&…

与TCP/IP协议的初次见面(一)

引言 最近LZ有了一点时间&#xff0c;于是便拿出TCP/IP的书本开始啃。开始的时候&#xff0c;啃起来枯燥无味&#xff0c;现在好不容易有点开窍&#xff0c;于是赶忙记录一下&#xff0c;生怕自己一转眼就给忘了。不过计算机系统原理就有点可惜了&#xff0c;最近一直没时间看&…

Oracle约数,Oracle约束简介

整理自《OCP认证指南》001 概述表约束是数据库能够实施业务规则以及保证数据遵循实体——关系模型的一种手段&#xff0c;其中&#xff0c;实体——关系模型由定义应用程序数据结构的系统分析所确定。在针对定义了约束的表执行任何DML时&#xff0c;如果DML违反了约束&#xff…

用cmd运行java可以javac不行(win10)

今天发现个有趣的问题&#xff0c;用cmd运行java可以javac不行。(win10) java-home和classpath配置没有问题,最后发现问提出先在path&#xff0c;在这里看并没有异常。 在上面图片中点击编辑文本&#xff0c;在这里可以清楚的看见多了引号和分号&#xff0c;将其删除&#xff0…

vs窗体 oracle,VS2010连接oracle数据库的简单例子

下面附有代码&#xff1a;using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Data.OracleClient;namespace 连接oracle数据库…

EasyUI实现两个列表联动

开发中会遇到如下界面的功能样式&#xff1a; 点击左边列表记录时&#xff0c;右边的列表显示所属分类的数据 实现方法&#xff1a; 1、首先绑定左侧列表的OnClickRow事件&#xff0c;方法为&#xff1a;getDetail. 如下代码所示。 <table id"dg" class"easy…

CodeForces 176A Trading Business 贪心

Trading Business题目连接&#xff1a; http://codeforces.com/problemset/problem/176/A Description To get money for a new aeonic blaster, ranger Qwerty decided to engage in trade for a while. He wants to buy some number of items (or probably not to buy anythi…

Docker快速入门实践-纯干货文章

Docker快速入门实践-老男孩高级架构师课程内容&#xff0c;如果细看还能发现讲解视频呦&#xff01;小伙伴们赶紧猛戳吧&#xff01;老男孩高级架构师内部学员实践文档分享&#xff01;Docker快速入门实践-纯干货文章老男孩教育2016启用最新的官方博文地址&#xff1a;http://b…

180102

https://pan.baidu.com/s/1nvqYFt3转载于:https://www.cnblogs.com/wjy123/p/8175593.html

oracle的iw算法,[转载]Oracle日期周详解IW

1 ORACLE中周相关知识描述1.1 日期格式化函数TO_CHAR(X [,FORMAT])&#xff1a;将X按FORMAT格式转换成字符串。X是一个日期&#xff0c;FORMAT是一个规定了X采用何种格式转换的格式字符串&#xff0c;FORMAT与周相关的有W&#xff0c;WW&#xff0c;IW&#xff0c;D&…

spring3 常见异常解决

初学spring&#xff0c;在网上搜到一篇spring3常见异常的文章&#xff0c;现转载如下&#xff1a; 以下异常使用的是spring是3.1.1&#xff0c;是我自己学习中遇到的错误笔记&#xff0c;有可能不是都适用&#xff0c;仅做参考 异常1&#xff1a;java.lang.NoClassDefFoundErro…

git忽略某个文件夹

data/cache/* !data/cache/index.html !data/cache/smiOAuthToken.php 转载于:https://www.cnblogs.com/xiaobiaomei/p/8177168.html

Iterm2的一些好用法

今天把mac带到公司办公了&#xff0c;爽歪歪啊。 1&#xff0c;如何脱离鼠标拷贝屏幕中的内容 1) Commandf 调出选择框&#xff0c;并在其中输入要复制的字符&#xff0c;可以使用Tab补全 2) 按 Command c复制字符 3) 字符已经复制到剪切板了

记录一些容易忘记的属性 -- UITabBarController

UIViewController中的 property(nonatomic,copy) NSString *title; // Localized title for use by a parent controller.&#xff0c;仔细理解英文注释的意思 下面是Title的实际作用 //创建给分栏控制器使用的视图控制器(包括导航控制器) FirstViewController *firstVC …

LINQ to Tree - A Generic Technique for Querying Tree-like Structures,包含遍历WPF VisualTree

https://www.codeproject.com/Articles/62397/LINQ-to-Tree-A-Generic-Technique-for-Querying-Tree#generic 转载于:https://www.cnblogs.com/sjqq/p/8177276.html

在 ASP.NET MVC 3 中应用 KindEditor

http://www.cnblogs.com/weicong/archive/2012/03/31/2427608.html 第一步 将 KindEditor 的源文件添加到项目中&#xff0c;建议放到 /Scripts/kindeditor 目录中&#xff0c;其中只需要有 lang目录、plugis目录、themes目录和kindeditor-min.js文件即可。 第二步 在 /Views/S…

php phalcon.dll 下载,extension=php_phalcon.dll 安装过程

到phalcon官方网站下载对应的dll文件 phalcon_x86_VC9_php5.4.0_1.2.5 我下的是这个版本 所以用的wamp版本的php也是 php 5.4版本&#xff1b;所以没啥问题&#xff01;3&#xff1a;下载完了dll文件放在 刚安装好的wamp服务器下&#xff1a;因为我安装的是D盘&#xff1a;D:\w…

centOS配置国内镜像

本文以163为例&#xff0c; cd /etc/yum.repos.d/wget http://mirrors.163.com/.help/CentOS6-Base-163.repo 转载于:https://www.cnblogs.com/azhqiang/p/8177408.html