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’类型的

  • 相关阅读:
    Roads in the North
    Labyrinth
    英语写作(二)
    语法长难句笔记
    英语写作(一)
    MySQL笔记(二)
    MySQL笔记(一)
    Mybatis简单使用与配置
    Mybatis映射文件
    什么是serializable接口?
  • 原文地址:https://www.cnblogs.com/mackxu/p/inherit0.html
Copyright © 2011-2022 走看看