用一段代碼去了解函數的結構

1,關於構造函數:當咱們要聲明一個函數的時候,函數自己就是一個對象,在這個對象上能夠定義自身屬性及方法,這些屬性屬於靜態方法,屬性;此時的函數對象是由Function構造函數構建的,Function可定義原型,Function.prototype,在此原型對象定義的方法,屬性,在function聲明稱的函數可訪問;function fn()聲明的函數對象,自帶原型對象,可在fn.prototype定義方法,屬性函數

2,實例化的構造函數: 經過new fn()實例化的函數類型對象,自身擁有執行上下文this,經過__proto__內部屬性可訪問構造函數的prototype,同時擁有此構造函數的變量對象,即做用域及鏈條this

 

    console.dir(Function.__proto__);
    console.dir(Function.__proto__.__proto__) //object
    console.dir(Function.__proto__.__proto__.__proto__); //null
    //用於構造函數的構造函數的靜態方法
    Function.FunctionStaticMethod = function() {
        console.log("I am static");
    };
    //用於構造函數的構造函數的原型
    Function.prototype.FunctionPrototypeMethod = function() {
        console.log("Function Prototype Method");
    }

    function fn() {
        var variable = "i am variable"
        this.selfName = " is fn attribute";
        this.selfSay = function() {
            console.log(this.selfName);
            console.log(variable);
        }
    }

    //靜態屬性
    fn.staticName = "I am static";
    fn.staticMethod = function() {
        console.log(this.staticName);
    }

    //函數原型
    fn.prototype.fnPrototypeName = "I am prototype";
    fn.prototype.fnPrototypeFn = function() {
        console.log(this.selfName);
    }

    var fnObj = new fn();
    //new fn自身方法
    fnObj.selfSay();
    //new fn原型方法
    fnObj.fnPrototypeFn();
    //fn的靜態方法
    fn.staticMethod();

    console.dir(fn);

    console.dir(fnObj);

    for (var attr in fnObj) {
        console.log(attr);
    }

    for (var fnAttr in fn) {
        console.log(fnAttr);
    }

 執行結果:spa

相關文章
相關標籤/搜索