zoukankan      html  css  js  c++  java
  • JavaScript 原型与原型链

    原型

    pototype

    每个函数都有一个 prototype 属性,函数的 prototype 属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型 。

    每一个 JavaScript 对象(null 除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性,如何关联呢?就是通过下面的 __proto__

    proto

    每一个JavaScript对象(除了 null )都具有的一个属性,叫 __proto__,这个属性会指向该对象的原型。

    绝大部分浏览器都支持这个非标准的方法访问原型,然而它并不存在于 Person.prototype 中,实际上,它是来自于 Object.prototype ,与其说是一个属性,不如说是一个 getter/setter,当使用 Object.__proto__时,可以理解成返回了 Object.getPrototypeOf(obj) 。

    Object.getPrototypeOf(p) === p.__proto__
    

    constructor

    那原型如何和构造函数关联呢?

    每个原型都有一个 constructor 属性指向关联的构造函数。

    Function.prototype.constructor === Function
    

    在这里插入图片描述

    实例与原型

    当读取实例的属性时,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层为止。

    但是万一还没有找到呢?原型的原型又是什么呢?

    原型的原型

    原型也是一个对象,既然是对象,我们就可以用最原始的方式创建它 ,其实原型对象就是通过 Object 构造函数生成的,结合之前所讲,实例的 __proto__ 指向构造函数的 prototype。

    在这里插入图片描述

    原型链

    上图中由相互关联的原型组成的链状结构就是原型链,也就是蓝色的这条线。

    任何一个实例对象通过原型链可以找到它对应的原型对象,原型对象上面的实例和方法都是实例共享的。

    一个对象中查找方法或属性时,它会先在自己的对象上去查找,如果找不到,就会沿着原型链__proto__ 一直向上级原型查找。

    注意:只有函数才有 prototype 属性,实例对象只有 __proto__,而函数有 __proto__ 是因为函数是 Function 的实例对象,但要区分函数的__proto__prototype.prototype(重要!!!)。

    function a() {}
    console.log(a.__proto__ === Function.prototype) // true
    console.log(a.prototype.__proto__ === Function.prototype) // false
    console.log(a.prototype.__proto__ === Object.prototype) // true
    

    参考链接

    JavaScript深入之从原型到原型链

  • 相关阅读:
    DevExpress 控件使用之GridControl基本属性设置
    GridControl基础设置(一)
    GitHub Top 100 简介
    Swift3.0 单例模式实现的几种方法-Dispatch_Once
    获取cell数组
    Xcode Apple Mach-O Linker Error Group错误
    Xcode运行设备由iphone/ipad变为my mac的解决方
    iOS 修改图片颜色
    iOS——UIActivityIndicatorView活动指示器
    iOS 消息处理之performSelector
  • 原文地址:https://www.cnblogs.com/cqkjxxxx/p/14975536.html
Copyright © 2011-2022 走看看