原文:http://www.cnblogs.com/jikey/archive/2011/05/13/2045005.html
//構造函數 //使自己的對象多次復制,同時實例根據設置的訪問等級可以訪問其內部的屬性和方法 //當對象被實例化后,構造函數會立即執行它所包含的任何代碼 function myObject(msg){ //特權屬性(公有屬性) this.myMsg = msg; //只在被實例化后的實例中可調用 this.address = '上海'; //私有屬性 var name = '豪情'; var age = 29; var that = this; //私有方法 function sayName(){ alert(that.name); } //特權方法(公有方法) //能被外部公開訪問 //這個方法每次實例化都要重新構造而prototype是原型共享,所有實例化后,都共同引用同一個 this.sayAge = function(){ alert(name); //在公有方法中可以訪問私有成員 } //私有和特權成員在函數的內部,在構造函數創建的每個實例中都會包含同樣的私有和特權成員的副本, //因而實例越多占用的內存越多 } //公有方法 //適用於通過new關鍵字實例化的該對象的每個實例 //向prototype中添加成員將會把新方法添加到構造函數的底層中去 myObject.prototype.sayHello = function(){ alert('hello everyone!'); } //靜態屬性 //適用於對象的特殊實例,就是作為Function對象實例的構造函數本身 myObject.name = 'china'; //靜態方法 myObject.alertname = function(){ alert(this.name); } //實例化 var m1 = new myObject('111'); //---- 測試屬性 ----// //console.log(myObject.name); //china //console.log(m1.name); //undefined, 靜態屬性不適用於一般實例 //console.log(m1.constructor.name); //china, 想訪問類的靜態屬性,先訪問該實例的構造函數,然后在訪問該類靜態屬性 //console.log(myObject.address); //undefined, myObject中的this指的不是函數本身,而是調用address的對象,而且只能是對象 //console.log(m1.address); //上海 此時this指的是實例化后的m1 //---- 測試方法 ----// //myObject.alertname(); //china,直接調用函數的類方法 //m1.alertname(); //FF: m1.alertname is not a function, alertname 是myObject類的方法,和實例對象沒有直接關系 //m1.constructor.alertname(); //china, 調用該對象構造函數(類函數)的方法(函數) //m1.sayHello(); //hello everyone, myObject類的prototype原型下的方法將會被實例繼承 //myObject.sayHello(); //myObject.sayHello is not a function,sayHello是原型方法,不是類的方法 //---- 測試prototype ----// //console.log(m1.prototype); //undefined, 實例對象沒有prototype //console.log(myObject.prototype); //Object //alert(myObject.prototype.constructor); //console.log返回myObject(msg),此時alert()更清楚,相當於myObject //console.log(myObject.prototype.constructor.name); //china, 相當於myObject.name;
參考:
近年來發現有人對上圖做了解釋,分享: