zoukankan      html  css  js  c++  java
  • Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同

    本系列作为Effective JavaScript的读书笔记。

     

    prototypegetPropertyOf__proto__是三个用来訪问prototype的方法。它们的命名方式非常类似因此非常easy带来困惑。

     

    它们的使用方式例如以下:

     

    prototype:

    一般用来为一个类型建立它的原型继承对象。比方C.prototype = xxx,这样就会让使用new C()得到的对象的原型对象为xxx。当然使用obj.prototype也可以得到obj的原型对象。

     

    getPropertyOf:

    Object.getPropertyOf(obj)ES5中用来得到obj对象的原型对象的标准方法。

     

    __proto__:

    obj.__proto__是一个非标准的用来得到obj对象的原型对象的方法。

     

    为了充分了解获取原型的各种方式,下面是一个样例:


    function User(name, passwordHash) {
    	this.name = name;
    	this.passwordHash = passwordHash;
    }
    User.prototype.toString = function() {
    	return "[User " + this.name + "]";
    };
    User.prototype.checkPassword = function(password) {
    	return hash(password) === this.passwordHash;
    };
    var u = new User("sfalken", "0ef33ae791068ec64b502d6cb0191387");
    

    User函数拥有一个默认的prototype属性,该属性的值是一个空对象。在以上的样例中,向prototype对象加入了两个方法,各自是toStringcheckPassword。当调用User构造函数得到一个新的对象u时,它的原型对象会被自己主动赋值到User.prototype对象。即u.prototype === User.prototype会返回true

     

    User函数,User.prototype,对象u之间的关系能够表演示样例如以下:




    上图中的箭头表示的是继承关系。当訪问u对象的某些属性时,会首先尝试读取u对象上的属性,假设u对象上并没有这个属性,就会查找其原型对象。

    比方当调用u.checkPassword()时,由于checkPassword定义在其原型对象上,所以在u对象上不会找到该属性,查找顺序是u-> u.prototype

     

    前面提到过,getPrototypeOf方法是ES5中用来得到某个对象的原型对象的标准方法。因此:


    Object.getPrototypeOf(u) === User.prototype; // true
    

    在一些环境中,同一时候提供了一个非标准的__proto__属性用来得到某个对象的原型对象。当环境不提供ES5的标准方法getPrototypeOf方法时,能够临时使用该属性作为替代。能够使用以下的代码測试环境中是否支持__proto__


    u.__proto__ === User.prototype; // true
    

    所以在JavaScript中,类的概念是由构造函数和其原型对象共同完毕的。构造函数中负责构造每一个对象特有的属性,比方上述样例中的namepassword属性。而其原型对象中负责存放全部对象共同拥有的属性,比方上述样例中的checkPasswordtoString方法。就像以下这张图表示的那样:




    总结:

    1. 使用C.prototype来决定new C()得到的对象的原型对象。
    2. Object.getPrototypeOf(obj)方法是ES5中提供的用于得到某个对象的原型对象的标准方法。
    3. obj.__proto__是获取某个对象的原型对象的非标准方法。
    4. JavaScript中,类的概念是由构造函数和其原型对象共同定义的。

  • 相关阅读:
    hadoop(五)scp命令copy文件和配置(完全分布式准备二)|7
    hadoop(四)centos7克隆|静态ip|机器名|映射关系|别名配置(完全分布式准备一)|6
    大数据及hadoop简要概念
    hadoop(三)伪分布模式hdfs文件处理|5
    Hadoop(二) 单节点案例grep和wordcount|4
    centos7 ip/映射/机器名变更/克隆(克隆后配置修改)|2
    centos7 NAT链接配置(静态ip/修改网卡名为eth0)|1
    Hadoop(一) centos7 jdk安装,hadoop安装|3
    hive常用函数五
    hive常用函数四
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4037605.html
Copyright © 2011-2022 走看看