在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;}

javascript的类和构造函数的更多相关文章

  1. JavaScript 类、构造函数、原型

    类.构造函数.原型  :本质均为函数 利用的原理是:词法作用域,调用对象及作用域链  闭包  属性查找方式    设计和new运算符一起使用的函数叫做构造函数. 构造函数的工作:初始化一个新创建的对象 ...

  2. 详解javascript的类

    前言 生活有度,人生添寿. 原文地址:详解javascript的类 博主博客地址:Damonare的个人博客 Javascript从当初的一个"弹窗语言",一步步发展成为现在前后端 ...

  3. Javascript定义类(class)的三种方法

    将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ...

  4. Atitit.javascript 实现类的方式原理大总结

    Atitit.javascript 实现类的方式原理大总结 1. 实现类的式::构造方法方式:原型方式:构造方法+原型的混合方式 1 2. 原型方式(function mode)经典式..实现属性推荐 ...

  5. [转]Javascript定义类的三种方法

    作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.html 将近2 ...

  6. JavaScript创建类的方式

    一些写类工具函数或框架的写类方式本质上都是 构造函数+原型.只有理解这一点才能真正明白如何用JavaScript写出面向对象的代码,或者说组织代码的方式使用面向对象方式.当然用JS也可写出函数式的代码 ...

  7. javascript 定义类(转载)

    Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的extend或冒号,它也没有用来支持虚函数的virtual,不过,Javascript是一门 ...

  8. javascript定义类和类的实现

    首先说说类,在一个类里我们会有以下的几个特征: 1. 公有方法 2. 私有方法 3. 属性 4. 私有变量 5. 析构函数 我们直接看一个例子: /***定义类***/ var Class = fun ...

  9. javascript创建类的6种方式

    javascript创建类的7种方式 一 使用字面量创建 1.1 示例 var obj={}; 1.2 使用场景 比较适用于临时构建一个对象,且不关注该对象的类型,只用于临时封装一次数据,且不适合代码 ...

随机推荐

  1. Layer 1: Single Objects

    Layer 1: 单一对象 粗略的说, 在javascript中所有对象都是maps的键值对. 键值对的实体在对象中称为属性( property).属性的key经常为 string类型,而他的valu ...

  2. [状压dp]HDU5045 Contest

    题意: n和人做m道题, 每俩人做的题数不能相差一题以上.(也就是每n道题分别由n个人完成)   给n个人分别做m道题的概率, 求完成m题的最大期望 $1\le N \le 10$ 注意!!! fil ...

  3. HDU 1400 (POJ 2411 ZOJ 1100)Mondriaan's Dream(DP + 状态压缩)

    Mondriaan's Dream Problem Description Squares and rectangles fascinated the famous Dutch painter Pie ...

  4. 李洪强iOS开发之-环信03_集成 SDK 基础功能

    李洪强iOS开发之-环信03_集成 SDK 基础功能 集成 SDK 基础功能 在您阅读此文档时,我们假定您已经具备了基础的 iOS 应用开发经验,并能够理解相关基础概念. SDK 同步/异步方法区分 ...

  5. 对TCP/IP网络协议的深入浅出归纳(转)

    前段时间做了一个开发,涉及到网络编程,开发过程比较顺利,但任务完成后始终觉得有一些疑惑.主要是因为对网络协议不太熟悉,对一些概念也没弄清楚.后来 我花了一些时间去了解这些网络协议,现在对TCP/IP网 ...

  6. WCF - Overview

    WCF stands for Windows Communication Foundation. The elementary feature of WCF is interoperability. ...

  7. Android开发之BroadcastReceiver的使用

    1.静态注册. 在manifest中注册. <receiver android:name="com.exce.learnbroadcastreceiver.MyReceiver&quo ...

  8. linux,Centos,bash: service: command not found

    很简单,这个问题是这样的,su 或者 su root:的话只是将当前身份转为root,用户shell并没有改变.所以有些系统命令不能使用. su -或者su -l或者su -l root,可以完全的将 ...

  9. Webform——购物车

    购物车主要实现的功能: ①在主页面可以将所有商品显示出来,包括价格,库存. ②点击购买可以累加产品,如果是同一种产品,只会累加每种产品的数量. ③查看购物车,可以查看明细,包括所购物品的名称,价格,数 ...

  10. clone Control event handlers at run time

    var btn2 =newButton(); btn2.Text= btn1.Text; btn2.size = btn1.size; To clone all events of any WinFo ...