神秘链接__proto__是什么鬼
_proto_实际上是某个实例对象的隐藏属性,而prototype是其构造器函数(或者说‘类’)的原型属性;
function Mine() {}
var hi = new Function(),
ha = new Object(),
me = new Mine();
由构造器函数创建的实例对象,也就是用new Function(),new Object(),new Mine()等方法创建的实例对象都有一个隐藏的内部属性,__proto__指向其构造器原型prototype的引用 ,也就是 实例.__proto__ = 构造器.prototype
实例对象和构造器之间通过这个隐藏属性实现通信连接
而其构造的原型又有一个__proto__属性 构造器.prototype.__proto__ = 构造器的构造器.prototype
一直往上找
构造器的构造器.prototype.__proto__ = 构造器的构造器的构造器.prototype;
...(假设该构造器是由父构造器一层一层构造出来的,实际可能只有一两层)
构造器的构造器的构造器.prototype.__proto__ == Function.prototype;
Function.prototype.__proto__ = Object.prototype;
Object.prototype.__proto__ = null;
结束了
function Mine(){
console.log(this.constructor)
}
var obj = new Mine();
obj.__proto__ == Mine.prototype;//true
console.log(obj.__proto__) // Mine {} 一个空的普通原型对象
obj.__proto__ == Mine //false 说明实例对象的原型链引用是指向其构造的原型属性的而不是直接指向构造器本身的
Mine.prototype.__proto__ == Object.prototype //true
Object.prototype.__proto__ == null;//true
Mine.prototype.__proto__ == Function.prototype //false
var objA = { name:"Mack",sex:'male' };
function Human(){};
Human.prototype=objA;
在还没有实例化之前我们调用Human.__proto__会得到什么呢?
Human.__proto__//function () {}
var designer=new Human();
designer.name="Jo";
designer.age="26";
现在我们来访问新建对象designer的属性,
designer.name//Jo
designer.age//26
这是新建对象本身就有的属性,当然我们也可以访问designer从其构造器函数那里继承来的属性。
designer.sex;//male;
加载机制,首先会在自身属性中找,没找到就去其原型中找,就好像有一个神秘的链接指向了相关的"原型对象";
//这里有歧义
designer.__proto__== (Human.prototype) == objA;//true;
designer.__proto__== new Human().prototype;//true;
designer.__proto__== Human.prototype;//true
what's the fuck?都尼玛为true,好忧伤的定义啊
_proto_实际上是某个对象实例的属性,而prototype这是其构造器函数的属性,或者说类的原型属性,所以两者并不等价;
typeof designer.__proto__;
//object;
typeof designer.prototype;
//undefined;实例对象没有原型属性 所以输出未定义
designer.constructor // ????
typeof designer.constructor.prototype;
//object
神秘链接__proto__是什么鬼的更多相关文章
- js原型链接(二)和object类的create方法
原型链的内部执行方式 <script> function Myclass(){ this.x=" x in Myclass"; } var obj=new Myclas ...
- 彻底弄懂JS原型与继承
本文由浅到深,循序渐进的将原型与继承的抽象概念形象化,且每个知识点都搭配相应的例子,尽可能的将其通俗化,而且本文最大的优点就是:长(为了更详细嘛). 一.原型 首先,我们先说说原型,但说到原型就得从函 ...
- 欢迎使用CSDN-markdown编辑器
私有变量和函数 在函数内部定义的变量和函数,如果不对外提供接口,外部是无法访问到的,也就是该函数的私有的变量和函数. function Box(){ var color = "blue&qu ...
- C#异步的世界【下】
接上篇:<C#异步的世界[上]> 上篇主要分析了async\await之前的一些异步模式,今天说异步的主要是指C#5的async\await异步.在此为了方便的表述,我们称async\aw ...
- C#异步(下)
上篇主要分析了async\await之前的一些异步模式,今天说异步的主要是指C#5的async\await异步.在此为了方便的表述,我们称async\await之前的异步为“旧异步”,async\aw ...
- JavaScript面向对象编程指南(五) 原型
第5章 原型 5.1 原型属性 function f(a,b){ return a*b; }; // length 属性 f.length; // constructor 构造属性 f.constru ...
- js中的原型
一:原型属性 函数本身也是一个包含了方法和属性的对象. 定义一个函数foo(),访问其他对象一样访问该函数的属性: function foo(a, b) { return a * b; } foo.l ...
- 【转】C#异步的世界【下】
[转]C#异步的世界[下] 接上篇:<C#异步的世界[上]> 上篇主要分析了async\await之前的一些异步模式,今天说异步的主要是指C#5的async\await异步.在此为了方便的 ...
- 读书笔记-JavaScript面向对象编程(二)
第5章 原型 5.1 原型属性(所有函数拥有一个prototype属性,默认为空对象) 5.1.1 利用原型添加方法和属性 function Gadget(name,color){ this.name ...
随机推荐
- 怎么样把UIImage保存到相册
需要保存的图片放在UIImage里面,保存只需要运行一下代码: UIImageWriteToSavedPhotosAlbum(outputImage, nil, nil, nil);
- [待解决问题] 启动不了Android工程
在使用 AudioInputStream sample = AudioSystem.getAudioInputStream(voiceSampleFile); 调用javax.sound.sample ...
- HBase 简介(强烈推荐看)
本博文的主要内容有: .HBase定义 .HBase 的特点 .HBase 访问接口 .HBase 存储结构 .HBase设计 .HBase安装 .HBase shell操作 .输入 help 可 ...
- Eclipse下Tomcat常用设置
Eclipse下Tomcat常用设置 1,Eclipse建立Tomcat服务 1.1 新建Server 首先这里是指,jee版的Eclipse.Eclipse是没有像MyEclipse那样集成Tomc ...
- NIO组件Selector工作机制详解(上)
转自:http://blog.csdn.net/haoel/article/details/2224055 一. 前言 自从J2SE 1.4版本以来,JDK发布了全新的I/O类库,简称NIO,其不但 ...
- delphi TSaveDialog
TSaveDialog 预览 实现过程 动态创建和使用保存文件对话框 procedure TForm1.Button1Click(Sender: TObject);begin wi ...
- TraceGL监控Node.js应用或者浏览器JavaScript代码
https://github.com/traceglMPL/tracegl TraceGL能够监控Node.js应用或者浏览器JavaScript代码的运行过程和细节.可视化的用户界面也很友好
- 设置textView或者label的行间距方法
一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...
- Linux 关闭及重启方式
一.shutdown 命令 作用:关闭或重启系统 使用权限:超级管理员使用 常用选项 1. -r 关机后立即重启 2. -h关机后不重启 3. -f快速关机,重启时跳过fsck(file system ...
- ASP.NET中如何生成图形验证码
通常生成一个图形验证码主要 有3个步骤: (1)随机产生一个长度为N的随机字符串,N的值可由开发可由开发人员自行设置.该字符串可以包含数字.字母等. (2)将随机生成的字符串创建成图片,并显示. (3 ...