案例代碼:
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