一、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>

  

最新文章

  1. JQuery简单标签页实现
  2. 引用、引用和术语定义&lt;abbr&gt;&lt;acronym&gt;&lt;address&gt;&lt;bdo&gt;&lt;blockquote&gt;&lt;q&gt;&lt;cite&gt;&lt;dfn&gt;
  3. asp.net mvc ClaimsIdentity 授权研究 (还是测试版 有bug)
  4. JSON取值前判断
  5. 文件“D:\file.txt”正由另一进程使用,因此该进程无法访问该文件。
  6. php请求URL中的参数有空格
  7. bootstrap-table 原来bootstrap还有这么强大的表格插件
  8. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) B
  9. item30,最小的k个数
  10. hdu 4726 Kia&#39;s Calculation
  11. javascript Deferred和递归次数限制
  12. 100M 宽带办理
  13. java基础(八章)
  14. common-pool2连接池详解与使用
  15. OO第二次博客作业——电梯调度
  16. sqlserver waitfor time 延迟函数的用法
  17. OpenLayers学习笔记(五)— 拖拽Feature图层
  18. nohup后台执行
  19. English trip V1 - 24. Accommodations Teacher:Maple Key: make suggestions 提出建议
  20. Android RecyclerView的使用

热门文章

  1. mysql —日志记录
  2. Oracle JDBC 标准连接实例
  3. AcFun 的视频架构演化实践——阅读心得
  4. fastjson序列化和反序列化报com.alibaba.fastjson.JSONException: autoType is not support异常问题,解决方案整合
  5. spring配置hibernate在使用oracle驱动时报错Cannot load JDBC driver class &#39;oracle.jdbc.driver.OracleDriver &#39;
  6. v-on绑定特性命名带小横杠 ‘-’与props属性中变量怎么对应
  7. TomCat概述
  8. 【python】详解事件驱动event实现
  9. MongoDB作为windows服务来安装-2
  10. Java8 根据对象某个属性值去重