zoukankan      html  css  js  c++  java
  • javascript原型

    javascript 有自己独特的属性查询机制(依靠原型链)

    当调用对象的属性时会一步一步链式往上查找直到找到属性或到顶层对象(null),如:

    function A(){}

    const a = new A()

    A是一个构造函数,a是通过构造函数生成的一个实例,函数在js中本身也是一个对象

    函数有prototype属性(对象)

    对象有constructor和原型对象(__proto__属性或者通过Object.getPrototypeOf函数获取的对象)

    对象的原型对象指向该对象构造函数的prototype属性

    # 构造函数拥有默认的prototype属性,属性是一个对象{constructor:指向自己, [一些其他扩展属性]},该prototype属性用于在通过new关键字创建对象时生成对象的父对象,所以通过new关键词创建的对象会有一个constructor属性指向创建自身的函数,但这个函数是不可靠的(构造函数在创建的时候可以任意修改prototype属性)。

    1. 所以 A 有默认的prototype = {constructor:A},通过A生成的a的父对象也就等于{constructor:A},当我们使用a.constructor时,由于自身没有该属性,所以查找父对象{constructor:A}获得;

    2. 由于函数本身是个对象,且是由Function创建,所以A的父对象为{constructor:Function};

    3. 像{constructor:A},{constructor:Function} 这种对象默认是由Object()创建,所以这类对象的父对象为Object.prototype;

    4. Object()这个函数也是由Function创建,所以父对象为{constructor:Function};

    5. 如果获取对象属性没有,会沿着原型链层层往上找,知道找到或者到达顶层;

     如下:

    表格1(A)
     
    A.prototype 对象  
    A.constructor Function 见表格5
    Object.getPrototypeOf(A) Function.prototype 见表格6
    表格2(A.prototype)
     
    A.prototype.constructor A 见表格1
    Object.getPrototypeOf(A.prototype) Object.prototype 见表格3
    表格3(Object.prototype)
     
    Object.prototype.constructor Object 见表格4
    Object.getPrototypeOf(Object.prototype) null  
    表格4(Object)
     
    Object.prototype 对象  
    Object.constructor Function 见表格5
    Object.getPrototypeOf(Object) Function.prototype 见表格6
    表格5(Function)
     
    Function.prototype 对象  
    Function.constructor Function 见表格5
    Object.getPrototypeOf(Function) Function.prototype 见表格6
    表格6(Function.prototype)
     
    Function.prototype.constructor Function 见表格5
    Object.getPrototypeOf(Function.prototype) Object.prototype 见表格3
    表格7(a)
     
    a.constructor A 见表格1
    Object.getPrototypeOf(a) A.prototype 见表格2
    function A(){};
    const a = new A();

    console.log(a.constructor === A);
    console.log(Object.getPrototypeOf(a) === A.prototype);
    console.log(A.constructor
    ===Function); console.log(Object.getPrototypeOf(A) === Function.prototype);
    console.log(A.prototype.constructor
    === A); console.log(Object.getPrototypeOf(A.prototype) === Object.prototype);
    console.log(Object.prototype.constructor
    === Object); console.log(Object.getPrototypeOf(Object.prototype) === null);
    console.log(Object.constructor
    === Function); console.log(Object.getPrototypeOf(Object) === Function.prototype);
    console.log(Function.constructor
    === Function);
    console.log(Object.getPrototypeOf(Function) === Function.prototype);

    console.log(Function.prototype.constructor === Function);
    console.log(Object.getPrototypeOf(Function.prototype) === Object.prototype);
  • 相关阅读:
    SCHTASKS /CREATE
    手机酷派4G5316 5313s 黑砖 求转成功 9008端口 9006端口 少走弯路选对镜像
    网络共享 相关知识与原理 操作步骤
    电脑 主板 硬盘的 电脑系统
    按键精灵 按键代码
    win7 快捷键 收集
    默认主页更改 主页锁定 打开浏览器时的网页设置
    按键精灵 以时间命名文件夹 创建文件 写入文件 和截图
    按键精灵-----按钮控制(开始子程序)的时候是要用到多线程的
    java web 大总结
  • 原文地址:https://www.cnblogs.com/mapingchuan/p/13044634.html
Copyright © 2011-2022 走看看