zoukankan      html  css  js  c++  java
  • js:原型/原型链,first chasing

    原本标题叫"如何快速的理解protoype/proto-chain",写了不少篇幅

    始终觉得过于笼统,且不利于自己深入理解

    为了食髓知味

    拆分成几个篇章来研究,但求短小精悍

    本篇主讲概念

    起跑: 

    prototype 原型:

    一个函数对象才有prototype属性,普通对象是没有的(不具备生育能力)

    在函数对象被创建时,prototype同时被创建

    之后这个函数对象new出来的所有对象,都会继承了prototype里的变量与方法

    __proto__  原型链引用(指针)

    需要值得注意的是

    a.一个普通对象的__proto__指向的是它的构造函数的prototype

    b.一个函数对象的prototype的__proto__默认是object{},即:由function Object()的原型

    c.Object.prototype._proto_===null

    一言蔽之,__proto__一定指向另一对象的prototype或者null

    万物生于null 

    一个常见的原型链,即是从一个普通对象—>构造函数原型—>ObJect函数原型—>null

    加速:

    让我们加点料

    var People = function(name){

      this.name=name

    };

    var p1 = new People('alex');

    p1.__proto__===p1.constructor.prototype ;//true

    p1.__proto__.__proto__===p1.constructor.prototype.constructor.prototype;//false

    p1.__proto__.__proto__ ;//Object {}

    p1.constructor.prototype.__proto__;//Object {}

    p1.constructor.__proto__;//function Empty()

    注意到这里的Empty();

    对于任何Fnobj,FnObject.prototype.__proto__  与FnObject.__proto__ 是不一样的

    任何FnObject.__proto__==Function.prototype

    Function.prototype //function Empty()

    学到这里我们不停在js中印证着:万物皆对象

    函数对象,也依然是对象

    挣扎:

    可是问题又来了

    Function.constructor //function Function() 

    Function.__proto__ //function Empty()

    Function.__proto__===Function.prototype;//true 这个十分有趣

    Function.__proto__.prototype===Function.prototype.__proto__;//false 这个理所应当,因为普通对象不存在在prototype

    Function对象,即使找几次constructor都是function Funcition()

    这有些无性繁殖或者自交的味道

    让人想起被缚的普罗米修斯,活在轮回之中

    通往上层的引用在于Function的__proto__和prototype

    而无论它的的原型还是还是原型指针都指向function Empty()

    追寻本质:

    Function.prototype.constructor //function Function() 死胡同...

    Function.__proto__ //function Empty()

    Function.__proto__.__proto__ // Object{} 

    Function.__proto__.__proto__ .__proto__ //null

    到了这里,一切亲切又自然

    又回到Object{}->null的怀抱

  • 相关阅读:
    调查问卷
    SQL 基础学习(1):下载DB Browser for SQLite. 下载graphviz(为了使用Rails ERD的前提)出现❌,已debug.
    路由完整实例代码
    如何自定义JSTL标签与SpringMVC 标签的属性中套JSTL标签报错的解决方法
    CSS样式表、JS脚本加载顺序与SpringMVC在URL路径中传参数与SpringMVC 拦截器
    SpringMVC的解释与搭建Maven私有代理服务器
    单调队列 bzoj3126 [Usaco2013 Open]Photo
    二分图 crf的军训
    单调队列 JC loves Mkk
    测试开发CICD——Git——window上安装git——配置基本信息
  • 原文地址:https://www.cnblogs.com/AlexNull/p/4829709.html
Copyright © 2011-2022 走看看