zoukankan      html  css  js  c++  java
  • JavaScript中的显示原型和隐形原型(理解原型链)

    显式原型:prototype

     隐式原型:__proto__

    1.显式原型和隐式原型是什么?

    在js中万物皆对象,方法(Function)是对象,方法的原型(Function.prototype)是对象,对象具有属性(__proto__)称为隐式原型,对象的隐式原型指向构造该对象的构造函数的显式原型。

    方法(Function)是一个特殊的对象,除了和其他对象一样具有__proto__属性以外,它还有一个自己特有的原型属性(prototype),这个属性是一个指针,指向原型对象。原型对象也有一个属性叫constructor,这个属性包含一个指针,指向原构造函数。

    注意:通过Function.prototype.bind方法构造出来的函数没有prototype属性。

    注意:Object.prototype.这个对象的是个例外,它的__proto__值为null。

    2.二者的关系

    隐式原型指向创建这个对象的函数的prototype

    首先我们来看如何创建一个对象

    a.通过对象字面量的方式。

    var person={
        name:"Tom"
    }

    b.通过new的方式创建

    复制代码
    复制代码
    //创建一个构造函数
    function person(name){
        this.name=name
    }
    //创建一个构造函数的实例
    var person1=new person;
    复制代码
    复制代码

    c.通过Object.creat()方式创建

    但是本质上3种方法都是通过new的方式创建的。

    其中通过Object.creat(o)创建出来的对象他的隐式原型指向o。

    通过对象字面量的方式创建的对象他的隐式原型指向Object.prototype。

    构造函数function person本质上是由Function构造函数创建的,它是Function的一个实例。原型对象本质上是由Object构造函数创建的。内置函数Array Number等也是有Function构造函数创建的。

    因此也就不难理解下面几个例子:

    复制代码
    复制代码
    //通过new的方式
    person1.__proto__===person.prototype //true
    person.prototype.__proto__===Object.prototype //true
    Object.__proto__===Function.prototype //true
    //内置函数
    Array.__proto__===Function.prototype //true
    Array.prototype.__proto__===Object.prototype //true
    复制代码
    复制代码

    Function的__proto__指向其构造函数Function的prototype;

    Object作为一个构造函数(是一个函数对象!!函数对象!!),所以他的__proto__指向Function.prototype;

    Function.prototype的__proto__指向其构造函数Object的prototype;

    Object.prototype的__prototype__指向null(尽头);

     原型图

     

  • 相关阅读:
    CentOS-Docker安装RabbitMQ集群(rabbitmq:3.7.16-management)
    Xcode Shortcuts
    In App Purchase
    CoreData
    Sandbox 文件存放规则
    在 mac os 上搭建 git server
    Git
    Git and Xcode
    心算技巧
    AppleScript
  • 原文地址:https://www.cnblogs.com/liutianzeng/p/10446077.html
Copyright © 2011-2022 走看看