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;}
javascript的类和构造函数的更多相关文章
- JavaScript 类、构造函数、原型
类.构造函数.原型 :本质均为函数 利用的原理是:词法作用域,调用对象及作用域链 闭包 属性查找方式 设计和new运算符一起使用的函数叫做构造函数. 构造函数的工作:初始化一个新创建的对象 ...
- 详解javascript的类
前言 生活有度,人生添寿. 原文地址:详解javascript的类 博主博客地址:Damonare的个人博客 Javascript从当初的一个"弹窗语言",一步步发展成为现在前后端 ...
- Javascript定义类(class)的三种方法
将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ...
- Atitit.javascript 实现类的方式原理大总结
Atitit.javascript 实现类的方式原理大总结 1. 实现类的式::构造方法方式:原型方式:构造方法+原型的混合方式 1 2. 原型方式(function mode)经典式..实现属性推荐 ...
- [转]Javascript定义类的三种方法
作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2012/07/three_ways_to_define_a_javascript_class.html 将近2 ...
- JavaScript创建类的方式
一些写类工具函数或框架的写类方式本质上都是 构造函数+原型.只有理解这一点才能真正明白如何用JavaScript写出面向对象的代码,或者说组织代码的方式使用面向对象方式.当然用JS也可写出函数式的代码 ...
- javascript 定义类(转载)
Javascript本身并不支持面向对象,它没有访问控制符,它没有定义类的关键字class,它没有支持继承的extend或冒号,它也没有用来支持虚函数的virtual,不过,Javascript是一门 ...
- javascript定义类和类的实现
首先说说类,在一个类里我们会有以下的几个特征: 1. 公有方法 2. 私有方法 3. 属性 4. 私有变量 5. 析构函数 我们直接看一个例子: /***定义类***/ var Class = fun ...
- javascript创建类的6种方式
javascript创建类的7种方式 一 使用字面量创建 1.1 示例 var obj={}; 1.2 使用场景 比较适用于临时构建一个对象,且不关注该对象的类型,只用于临时封装一次数据,且不适合代码 ...
随机推荐
- Oracle删除所有表
Oracle 清理用户所有的表 PLSQL中执行语句 select 'drop '||object_type||' '||object_name||';' from user_objects; 结果集 ...
- OpenCV学习-b
OpenCV是开源计算机视觉和机器学习库.包含成千上万优化过的算法.项目地址:http://opencv.org/about.html.官方文档:http://docs.opencv.org/modu ...
- Pentaho Data Integration笔记 (四):Kitchen
官方网站: http://wiki.pentaho.com/display/EAI/Kitchen+User+Documentation Kitchen Kitchen是一个可以执行Spoon编辑的J ...
- Android 绘制计时器
用小米的手机,发现其实还可以,无意间点开小米的计时器,发现界面非常好看和实用.于是自己仿照着写一个,由于技术不好,代码整体结构上可能有点乱,但主要的实现功能和掌握知识点. Android中绘制采用ca ...
- AForm — 模型驱动的自动化表单解决方案
http://xiehuiqi220.github.io/AForm/doc/book/#
- Unity3d与android通信
原地址:http://www.cnblogs.com/alongu3d/p/3661077.html unity3d与android的通信,从网上搜索了一些文章,发现我的始终不成功!后来调试通了,现在 ...
- [TSP+floyd]POJ3311 Hie with the Pie
题意: 给i到j花费的地图 1到n编号 一个人要从1遍历n个城市后回到1 求最小的花费(可以重复走) 分析 http://www.cnblogs.com/Empress/p/4039240.htm ...
- Newtonsoft.Json.JsonWriter
[一篮饭特稀原创,转载请注明出自http://www.cnblogs.com/wanghafan/p/4754769.html] JsonWriter使用: 前台 $.post("Ajax ...
- *[codility]GenomicRangeQuery
http://codility.com/demo/take-sample-test/genomicrangequery 这题有点意思.一开始以为是RMQ或者线段树,但这样要O(n*logn).考虑到只 ...
- velocity-1.7学习笔记
Velocity是由Apache软件组织提供的一项开放源码项目,它是一个基于Java的模板引擎.通过Velocity模板语言(Velocity Template Language,VTL)定义模板(T ...