zoukankan      html  css  js  c++  java
  • JS关于辅助函数inherit()的小问题

    最近在阅读《JavaScript权威指南》(第六版)在第六章P122有这么一段代码:

    // 返回一个继承自原型对象proto的属性的新对象
    // 这里可以用到ES5的Object.create()函数
    function inherit(proto) {
        //proto是一个对象,但不能是null
        if(proto == null) throw TypeError();
        if(Object.create) return Object.create(proto);    //如果Object.create()存在,使用它
        var t = typeof proto;                    //否则进一步检查
        if(t!=='object' && t!=='function') throw TypeError();
        var F = function() {};        // 定义一个空构造函数
        F.prototype = proto;        // 将其原型属性设置为proto
        return new F();                // 使用F()创建proto的继承对象
    }

    很明显辅助函数的用途是创建一个继承父类原型的新对象

    问题

    在关于下面的这句判断时,一时无法理解

    var t = typeof proto;                    //否则进一步检查
    if(t!=='object' && t!=='function') throw TypeError();

    我们的印象中原型对象应该是个Object或者直接是字面量,那么传递的参数类型会有“function”类型情况吗

    理解

    函数也是对象,也可以有自己的属性和方法。等等,这不是我们的静态属性和方法啊!这里是指把函数看成可以添加属性的对象

    // 测试传递function类型
    var func = function() {};
    func.text = 'good work';
    func.getText = function() {
        return func.text;
    };
    console.log(typeof func);        // 'function'
    // 传递function类型,返回以func为原型的新对象
    var subFunc = inherit(func);            
    console.log(subFunc.getText());    // 输出:'good work'

    好吧,一个蛋疼的证明。原来是可以传递’function’类型的

  • 相关阅读:
    Luogu-1381 单词背诵
    Luogu-3413 SAC#1
    HBase版本进化史及大版本特性
    scala解析json —— json4s 解析json方法汇总
    sparkSQL获取DataFrame的几种方式
    scala调用系统-scala.sys.process使用
    spark textFile读取多个文件
    CentOS 7 配置SFTP
    spark优化——依赖包传入HDFS_spark.yarn.jar和spark.yarn.archive的使用
    mysqldump备份和恢复
  • 原文地址:https://www.cnblogs.com/mackxu/p/inherit0.html
Copyright © 2011-2022 走看看