在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. sencha touch mvc

    controller: Ext.define('MyApp2.controller.MyController1', { extend: 'Ext.app.Controller', config: { ...

  2. Oracle job procedure

    Oracle job procedure 存储过程定时任务 oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务. 一.查询系统中的job,可以查询视图 --相关视图 ...

  3. 重启Finder

    解决Finder卡死的问题! 方法一:在Dock 图标上操作 按住 Option 键并右键点按 Finder 图标,选择菜单中的“重新开启” 方法二:在终端里操作 打开终端(应用程序 – 实用工具), ...

  4. Android Learning:微信第三方登录

    这两天,解决了微信第三方授权登录的问题,作为一个新手,想想也是一把辛酸泪.我想着,就把我的遇到的坑给大家分享一下,避免新手遇到我这样的问题能够顺利避开. 步骤一 微信开发者平台 我开始的解决思路是,去 ...

  5. 上下切换js

    <div class="wview"> <span class="prevs" id="prevs-j"></ ...

  6. [转载]MongoDB学习(二):数据类型和基本概念

    数据类型 基本数据类型 MongoDB的文件存储格式为BSON,同JSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型.与数据库打交道的那些应用.例如,JSON没有 ...

  7. java多线程下载和断点续传

    java多线程下载和断点续传,示例代码只实现了多线程,断点只做了介绍.但是实际测试结果不是很理想,不知道是哪里出了问题.所以贴上来请高手修正. [Java]代码 import java.io.File ...

  8. 盘点六大在中国复制失败的O2O案例

    O2O概念自2010年11月被引入中国以来被各方迅速炒热,各种分类信息网站.点评类网站.团购类网站.订餐类网站等都开始宣称自己为O2O模式.O2O最基本的解释是通过线上引导流量去线下体验和消费,从这个 ...

  9. ANDROID_MARS学习笔记_S02_007_Animation第一种使用方式:代码

    一.简介 二.代码1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...

  10. Altium designer入门篇-过孔不开窗

    有没有觉得在设计PCB的时候,放的过孔开窗了,在焊接实际PCB板子的时候,会有各种锡尖,拖锡尾巴,严重的网络间短路.此经验简述了使用Altium designer软件,让过孔不开窗的设置办法.初学者可 ...