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