zoukankan      html  css  js  c++  java
  • 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  
  • 相关阅读:
    day8--socket文件传输
    day8--socket网络编程进阶
    day5模块学习--re正则模块
    day6作业--游戏人生完善
    day1作业--登录接口
    expect自动化工具
    day17--JQuery实例
    day17--JQuery
    day--16页面布局
    day16--HTML、CSS、JavaScript总结
  • 原文地址:https://www.cnblogs.com/guanghe/p/9525434.html
Copyright © 2011-2022 走看看