zoukankan      html  css  js  c++  java
  • javascript的类和构造函数

    在javascript中,类的实现是基于其原型继承机制的。如果两个实例都从同一个原型对象上继承了属性,我们就说它们是同一个类的实例。那么,如果两个对象继承自同一个原型,那基本上可以认为它们是由同一个构造函数创建并初始化的。

    先来看一个例子

    function Test(a, b){

      this.a = a;

      this.b = b;

    }

    Test.prototype = {

      add: function(){

        return this.a + this.b;

      }

    };

    var o1 = new Test(10, 20);

    o1.add();  //30

    var o2 = new Test(1, 2);

    o2.add();  //3

    刚刚提到的,原型对象是类的唯一标识就是:当且仅当两个对象继承自同一个原型对象时,它们才是同一个类的实例。因此,上述例子,我们可以认为对象o1、o2继承自同一个原型对象Test,因此,它们属于同一个"类Test"的实例。

    同时,在上述例子中,我们将Test.prototype定义为一个新对象,这个对象包含类所需要的方法。其实并没有必要新创建一个对象,用单个对象直接量的属性就可以方便地定义原型上的方法。任何javascript函数都可以用做构造函数,并且调用构造函数是需要用到一个prototype属性的。因此,每个javascript函数都自动拥有一个prototype属性,这个属性的值是一个对象,这个对象包含唯一一个不可枚举属性constructor,constructor属性的值则是一个函数对象。

    来看一个例子:

    var Fun = function(){};  //函数对象

    var pro = Fun.prototype;  //函数对象Test相关联的原型对象

    var con = pro.constructor;  //原型对象相关联的函数

    con === Fun;  //true

    因此,我们可以看到对于函数对象Fun.prototype.constructor === Fun

    同时,我们可以看到构造函数的原型中存在预先定义好的constructor属性,这就意味着对象继承的constructor属性指代它们的构造函数,由于构造函数是类的"公共标识",因此这个constructor属性为对象提供了类,如下例所示:

    var obj = new Fun();

    obj.constructor === Fun;

    最后,需要注意的是,第一例子中,定义的Test类使用它自身的一个新对象重新写预定义的Test.prototype对象,而这个新定义的原型对象并不包含constructor属性,因此需要我们手动添加。

    Test.prototype = {

      constructor: Test,

      add: function(){

        return this.a + this.b;

      }

    };


    此外,我们还可以使用另一种办法,也即使用预定义的原型对象。因为预定义的原型对象包含constructor属性,然后可以依次给原型对象添加方法,如下例所示:

    Test.prototype.add = function(){return this.a + this.b;}

  • 相关阅读:
    配置JDK环境变量
    yum 卸载安装的软件包及依赖
    常用命令--patch
    Git 源码编译安装
    基础Git命令
    下载资源的一些方法
    Python/Jupyter小技巧
    欺诈类Kaggle竞赛赛题描述
    工作小笔记
    进入互联网数据分析岗位需要明白的一些事
  • 原文地址:https://www.cnblogs.com/ArthurPatten/p/3506437.html
Copyright © 2011-2022 走看看