JS類、對象、方法、prototype、_proto_


案例代碼:

 1 function People(name) {  2     //對象屬性
 3     this.name = name;  4     //對象方法
 5     this.Introduce = function() {  6         alert("My name is " + this.name);  7  }  8 }  9 //類方法
10 People.Run = function(){ 11     alert("I can run"); 12 } 13 //原型方法
14 People.prototype.IntroduceChinese = function() { 15     alert("我的名字是" + this.name); 16 }

測試:

var p1 = new People("guanghe");

分析:

對象方法需要通過實例化對象去調用:
  p1.Introduce();
原型方法也需要通過實例化對象去調用,js查找屬性在對象本身查不到,會去查其構造方法的原型的屬性,而不是構造方法的屬性:
  p1.IntroduceChinese();
其實等同於:
  p1._proto_.IntroduceChinese();
類方法不需要通過實例化對象去調用,實例化的對象反而調不到:
  People.Run();
想要通過對象調用類的方法,因為其構造方法即為父類,所以可以這樣調用:
  p1.constructor.Run();

總結: 

  由此可見,p1在被創建之時,繼承了People的prototype(其實是生成了指向其構造方法原型的指針_proto_),並執行了構造方法。通過每個js向都有的_proto_屬性,能夠訪問到構造方法的原型的屬性,形式上直接調用,就像在訪問自己的屬性一樣。而構造方法的屬性卻不能直接訪問,要調用還要使用constructor屬性間接進行調用。

知識點:

1,js一切皆對象,方法也是對象
2,js對象的_proto_指向其constructor的prototype
3,js一般對象沒有prototype屬性,類(方法)對象才有
4,js通過new出來的對象能夠訪問其構造方法原型的所有屬性,但不能直接訪問構造方法的屬性
5,js的對象是動態的

1 //創建一個對象
2 p1 = new People(); 3 //給其構造方法的原型添加屬性
4 People.prototype.a = 1; 5 //之前創建的對象能夠訪問到新添加的屬性
6 p1.a  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM