zoukankan      html  css  js  c++  java
  • 原型与原型链:原型 显式原型与隐式原型 原型链 原型链中的属性问题 原型继承 探索instanceof 测试题 原理图

    原型

    1.函数的prototype属性

    每个函数都有一个prototype属性,它默认指向一个空Object实例对象,空对象也就是没有我们的属性(即称为:原型对象)
    原型对象中有一个属性constructor,它指向该原型对象的构造函数对象

    2.给原型对象添加属性(一般都是方法)

    作用:构造函数的所有实例对象自动拥有构造函数原型中的属性(方法),可以直接使用

    显式原型与隐式原型

    1.每个函数function都有一个prototype,即显式原型(属性)
    2.每个实例对象都有一个_ _proto_ _,可称为隐式原型(属性)
    3.实例对象的隐式原型的值等于其对应构造函数的显式原型的值
    4.总结
    函数的prototype属性:在定义函数时自动添加的,默认值是一个空Object对象
    对象的_ _proto_ _属性:创建对象时自动添加的,默认值为构造函数的prototype属性值
    程序员能直接操作显式原型(通过显式原型来给原型对象添加属性和方法),但不能直接操作隐式原型(ES6之前)
    5.内存结构

    原型链

    1.原型链

    访问一个对象的属性时,先在自身属性中查找,找到返回
    如果没有,再沿着_ _proto_ _这条链向上查找,找到返回
    如果最终没找到,返回undefined
    别名:隐式原型链
    作用:查找对象的属性(方法)

    2.注意

    函数的显式原型指向的对象默认是空的Object实例对象(Object除外,Object.prototype instanceof Object = false)
    构造函数和它的原型对象相互引用。
    直接创建的对象默认构造函数为Object。
    Function的显式原型和隐式原型一样,因为它也是函数,是new自己产生的。
    所有函数都是Function的实例包括Function本身,所以它们的_ _proto_ _都是一样的。
    Object的原型对象是原型链的尽头,Object.prototype._ _proto_ _ = null。
    所有函数的原型对象默认都是Object的实例,Object除外。
    原型链一句话说明:实例对象有一个隐式原型指向一个原型对象,原型对象也是一个实例对象,它的隐式原型指向它的原型对象,……,形成了原型链,尽头是Object的原型对象,因为它的隐式原型值为null。

    原型链中的属性问题

    1.读取对象的属性值时:会自动到原型链中查找
    2.设置对象的属性值时:不会查找原型链,如果当前对象没有该属性,直接添加此属性并设置值
    3.方法一般定义在原型中,属性一般通过构造函数定义在对象本身上,也就是将属性放在构造函数中初始化(每创建一个实例对象其属性值都是不同的,但其方法是相同的,类似于JAVA,一个类中方法是通用的,但是每个对象的属性不同)

    原型继承(基于原型的继承)

    构造函数的实例对象自动拥有构造函数原型对象的属性(方法),利用的就是原型链。

    探索instanceof

    instanceof是如何判断的?

    表达式:A instanceof B
    判断:A是否是B的实例对象
    原理:如果B函数的显式原型对象在A对象的原型链上,返回true,否则返回false(前面实例对象的原型链上是否有后面构造函数的原型对象)

    测试题

     

     

     

    原理图

    学识浅薄,如有错误,恳请斧正,在下不胜感激。

  • 相关阅读:
    表连接 索引
    数据库类型
    Java重试机制
    Result Maps collection already contains value for xxxMapper.BaseResultMap错误解决办法
    Lombok插件
    REST以及RESTful
    Dubbo
    【日志】MySQL中有多少种日志
    【缓存池】转-Mysql参数innodb_buffer_pool_size
    【MRR】转-MySQL 的 MRR 优化
  • 原文地址:https://www.cnblogs.com/yin-jie/p/14745365.html
Copyright © 2011-2022 走看看