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