关于JS原型以及原型链、instanceof的一些理解
2024-08-31 15:43:31
一、JS原型
首先要区分两个概念
1、构造函数
2、实例:由构造函数通过new方式创建出来的就是实例
<script>
function Foo() { } var f = new Foo();
console.log(f instanceof Foo);
</script>
比如上面这段代码,f是由new Foo()出来的,那么f称为Foo的实例,Foo也称为f实例的构造函数
1、每一个函数都有一个属性 prototype,这个属性也称该函数的显示原型,prototype是一个空的object对象
2、每一个实例都有一个属性 __proto__,这个属性也称这个实例的原型对象,也称隐式原型
3、实例的原型对象(隐式原型)等于该实例构造函数的显示原型
4、所有通过new Foo()创建出来的实例的__proto__都指向Foo.prototype,所以这些实例的__proto__都是同一个原型对象
这个用上面的代码来说明的话,那就是
<script>
function Foo() { } var f = new Foo();
var k = new Foo(); //f是Foo的实例
console.log(f instanceof Foo); //true //3、实例的原型对象(隐式原型)等于该实例构造函数的显示原型
console.log(f.__proto__ === Foo.prototype);//true //4、所有通过new Foo()创建出来的实例的__proto__都指向Foo.prototype,所以这些实例的__proto__都是同一个对象
console.log(k.__proto__ === f.__proto__);//true
</script>
二、原型链
当试图得到一个实例的某个属性时,如果这个实例本身没有这个属性,那么会去它的_proto_里去找。
如果它的_proto_里没有这个属性,则去它_proto_的_proto_中去找,这样一直往上找,就形成了一个原型链。
<script>
function Foo() {
this.age = 12;
}
Foo.prototype.name = "werben"; var f = new Foo(); //f这个实例本身有age属性,直接读取
console.log(f.age); //output: 12 //f这个实例本身没有name属性,那么会去它的_proto_里去找, 也就是Foo.prototype中去找name
console.log(f.name); //output: werben
</script>
函数本身也是一个实例,是Function这个构造函数的实例,所以函数除了拥有prototype属性之外,它本身也拥有作为实例拥有的__proto__属性。
比如下面的代码,三种定义Foo函数的方式都是等价的。其中一种方式表明Foo也是Function的一个实例
<script> function Foo() {
console.log('hello world');
} var Foo = function() {
console.log('hello world');
} var Foo = new Function(
"console.log('hello world');"
); </script>
最新文章
- JQuery简单标签页实现
- 引用、引用和术语定义<;abbr>;<;acronym>;<;address>;<;bdo>;<;blockquote>;<;q>;<;cite>;<;dfn>;
- asp.net mvc ClaimsIdentity 授权研究 (还是测试版 有bug)
- JSON取值前判断
- 文件“D:\file.txt”正由另一进程使用,因此该进程无法访问该文件。
- php请求URL中的参数有空格
- bootstrap-table 原来bootstrap还有这么强大的表格插件
- Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) B
- item30,最小的k个数
- hdu 4726 Kia&#39;s Calculation
- javascript Deferred和递归次数限制
- 100M 宽带办理
- java基础(八章)
- common-pool2连接池详解与使用
- OO第二次博客作业——电梯调度
- sqlserver waitfor time 延迟函数的用法
- OpenLayers学习笔记(五)— 拖拽Feature图层
- nohup后台执行
- English trip V1 - 24. Accommodations Teacher:Maple Key: make suggestions 提出建议
- Android RecyclerView的使用
热门文章
- mysql —日志记录
- Oracle JDBC 标准连接实例
- AcFun 的视频架构演化实践——阅读心得
- fastjson序列化和反序列化报com.alibaba.fastjson.JSONException: autoType is not support异常问题,解决方案整合
- spring配置hibernate在使用oracle驱动时报错Cannot load JDBC driver class &#39;oracle.jdbc.driver.OracleDriver &#39;
- v-on绑定特性命名带小横杠 ‘-’与props属性中变量怎么对应
- TomCat概述
- 【python】详解事件驱动event实现
- MongoDB作为windows服务来安装-2
- Java8 根据对象某个属性值去重