博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS原形链
阅读量:4326 次
发布时间:2019-06-06

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

JS中的对象分为两种,

1.普通对象obj

2.函数对象function

任何一个对象都有__proto__,但是只有函数对象有prototype

var o1 = {}; var o2 =new Object();var o3 = new f1();function f1(){}; var f2 = function(){};var f3 = new Function('str','console.log(str)');console.log(typeof Object); //function console.log(typeof Function); //functionconsole.log(typeof f1); //function console.log(typeof f2); //function console.log(typeof f3); //functionconsole.log(typeof o1); //object console.log(typeof o2); //object console.log(typeof o3); //object

我们可以new一个函数对象直接获取他的所有属性。

这些属性就归自己所有了。同时自己还可以拿到它的隐性属性。  

var Person = function(){

  this.name = "name";

  this.lala = "lala";

}

Person.prototype.lala = "lalala";//隐性属性

Person.prototype.xixi = "xixixi";//隐性属性

var Person1 = new Person();

1.普通对象person1

2.函数对象Person 

于是person1获取了Person的所有属性,归自己所有,同时还可以得到所有的Person的隐性属性,就是prototype的属性。

因为person1的隐形链 指向了Person的隐性属性。如果有多个级别,那么会一级一级向上面找去

个人理解:

Person.prototype.constructor == Person;

person1.__proto__ == Person.prototype;
person1.constructor == Person;

隐形链:__proto__

隐形属性(或方法):prototype

通过隐形链可以获取隐形属性。

举个例子:

Array.prototype,里面存放着Array的隐形属性。我们可以console.log(Array.prototype)打印出来

var b = [];

b是Array的小弟,b.constructor == Array;

那么b.__proto__ == Array.prototype;

于是b可以直接用Array的隐性属性。

再举个例子:

var  obj = {};

那么我们发现:obj.constuctor == Object;

既然obj是Object的小弟,那么:obj.__proto__ == Object.prototype;

console.log(Object.prototype);

发现好多隐藏方法,比如:toString,valueOf,都可以直接用了嘻嘻。

再回来看:

person1.constructor == Person;                 //Person的小弟是person1

person1.__proto__ == Person.prototype;  //所以小弟拥有Person的隐藏属性

Person.prototype.constructor == Person; //其实Person.prototype也是Person的小弟,一个特殊的小弟,可以理解为,函数对象的prototype属性,才是链接的对象。

 

转载于:https://www.cnblogs.com/beimingbingpo/articles/8420962.html

你可能感兴趣的文章
Thrift源码分析(二)-- 协议和编解码
查看>>
考勤系统之计算工作小时数
查看>>
4.1 分解条件式
查看>>
Equivalent Strings
查看>>
flume handler
查看>>
收藏其他博客园主写的代码,学习加自用。先表示感谢!!!
查看>>
H5 表单标签
查看>>
su 与 su - 区别
查看>>
C语言编程-9_4 字符统计
查看>>
在webconfig中写好连接后,在程序中如何调用?
查看>>
限制用户不能删除SharePoint列表中的条目(项目)
查看>>
【Linux网络编程】使用GDB调试程序
查看>>
feign调用spring clound eureka 注册中心服务
查看>>
ZT:Linux上安装JDK,最准确
查看>>
LimeJS指南3
查看>>
关于C++ const成员的一些细节
查看>>
《代码大全》学习摘要(五)软件构建中的设计(下)
查看>>
C#检测驱动是否安装的问题
查看>>
web-4. 装饰页面的图像
查看>>
微信测试账户
查看>>