Javascript类和模块(一)

  1. 原型对象是类的唯一标识:当且仅当两个对象继承自同一个原型对象时,它们才是属于同一个类的实例。而初始化对象的状态的构造函数则不能作为类的标识,两个构造函数的prototype属性可能指向同一个原型对象。那么这两个构造函数创建的实例是属于同一个类的。
  2. 一个典型的面向对象的js程序:

functionRange(from,to){

this.from=from;

this.to=to;

}

Range.prototype={

includes:function(x){

return this.from<=x&&x<=this.to;

},

foreach:function(f){

for(varx=Math.ceil(this.from);x<this.to;x++){

f.log(x);

}

},

toString:function(){

return"("+this.from+"..."+this.to+")";

}

}

//用例

var r=new Range(1,3);

console.log(r.includes(2));

r.foreach(console);

console.log(r.toString());

3.代码规范:类(构造函数)首字母大写,(普通)方法首字母小写

4.实际上instanceof运算符并不会检查r是否是由Range()构造函数而来,而会检查是否继承自Range.prototype。不过,instanceof的语法则强化了“构造函数是类的公有标识”的概念。

5.constructor属性:实例,

varF=function(){

}

varp=F.prototype;//这是F相关联的原型对象

var c=p.constructor;//这是与原型相关联的函数

console.log(p);//函数的原型是对象Object{}

console.log(c);//p的构造函数是构造函数function(){}

可以看到构造函数的原型中存在预先定义好的constructor属性,这意味着对象通常继承的constructor均指代它们的构造函数。由于构造函数是“公共标识”,因此这个constructor属性为对象提供了类。

var o=new F(); //创建类F的一个对象

o.constructor===F;//true,constructor属性指代这个类

构造函数和原型对象之间的关系如下图:

需要注意的是2中定义的Range类使用它自身的一个对象重写预定义的Range.prototype对象。这个新定义的原型对象不含有constructor属性。如下图:

因此Range类的实例也不含有constructor属性。我们可以通过补救措施来修正这个问题,显示给原型添加一个构造函数。

Range.prototype={

constructor:Range,

includes:function(x){

returnthis.from<=x&&x<=this.to;

},

foreach:function(f){

for(varx=Math.ceil(this.from);x<this.to;x++){

f.log(x);

}

},

toString:function(){

return"("+this.from+"..."+this.to+")";

}

}

另一种常见的解决方法是使用预定义的原型对象,预定义的原型对象包含constructor属性,然后依次给原型对象添加方法

Range.prototype.includes=function(x){returnthis.from<=x&&x<=this.to;};

Range.prototype.foreach=function(f){for(var x=Math.ceil(this.from);x<this.to;x++){f.log(x);};

Range.prototype.toString=function(){return"("+this.from+"..."+this.to+")";};

6.Javascript中类继承:构造函数对象,任何添加到这个构造函数对象中的属性都是类字段和类方法(如果属性值是函数的话就是类方法);原型对象,原型对象的属性被类的所有实例所继承,如果原型对象的属性值是函数的话,这个函数就作为类的实例的方法来调用;实例对象,类的每个实例都是一个独立的对象,直接给这个实例定义的属性是不会为所有实例对象共享的。定义在实例上的非函数属性,实际上是实例的字段。

7.javascript中定义类的步骤可以缩减为三步:1)先定义一个构造函数,并设置初始化新对象的实例属性。2)给构造函数的prototy对象定义实例的方法;3)给构造函数定义类字段和类属性,下面是一段模拟java中类的定义的js代码:

/**

* 复数的构造函数,这个构造函数为它所创建的每个实例定义实例字段r和i

* @param {[type]} real      [实部]

* @param {[type]} imaginary [虚部]

*/

functionComplex(real,imaginary){

if(isNaN(real)||isNaN(imaginary)){

throw new TypeError(‘传入参数类型错误!‘);

}

this.r=real;

this.i=imaginary;

}

/**

* 复数加法,类的实例方法定义为原型对象的函数值属性

* 这里定义的方法可以被所有实例继承,并为他们提供共享行为

* 需要注意的是,Javascript的实例化方法必须使用关键字this来存取实例的字段

* @param {[type]} c [description]

*/

Complex.prototype.add=function(c){

return new Complex(this.r+c.r,this.i+c.i);

}

//这里定义了一些复数运算有帮助的类字段

Complex.ZERO=new Complex(0,0);

8.       编码规范:1)以大写字母命名的成员是不能修改的;2)以下划线为前缀的命名在类外不可见

9.Javascript中基于原型的继承机制是动态的:对象从其原型继承属性,如果创建对象之后原型的属性发生改变,也会影响到继承这个原型的所有实例对象。

时间: 2024-10-13 02:44:24

Javascript类和模块(一)的相关文章

Javascript类和模块(二)

鸭式辩型:像鸭子一样走路,游泳并且呱呱叫的鸟就是鸭子.对于Javascript程序员来说,这句话可以理解为"如果一个对象可以像鸭子一样走路.游泳并且嘎嘎叫,就认为这个对象是鸭子,哪怕它并不是从鸭子类的原型对象继承而来的". toJSON()方法:这个方法是由JSON.stringify()自动调用的.JSON格式用于序列化良好的数据结构,而且可以处理Javascript原始值,数组和纯对象.它和类无关,当对一个对象执行序列化操作时,它会忽略对象的原型和构造函数. 使用闭包来封装的状态一

第九章:Javascript类和模块

(过年了,祝大家新年好!) 第6章详细介绍了javascript对象,每个javascript对象都是一个属性集合,相互之间没有任何联系.在javascript中也可以定义对象的类,让每个对象都共享某些属性,这种“共享”的特性是非常有用的.类的成员或实例都包含一些属性,用以存放它们的状态,其中有些属性定义了它们的行为(通常称为方法).这些行为通常是由类定义的,而且为所有实例所共享.例如,假如有一个名为complex的类用来表示复数,同时还定义了一些复数运算.一个complex实例应当包含复数的实

JavaScript类和模块

类 在JavaScript中,类的实现是基于原型继承机制的.如果两个实例都从同一个原型对象上继承了属性,我们说它们是同一个类的实例. 构造函数 从某种意义上讲,定义构造函数即是定义类,所以构造函数名首字母要大写,而普通的函数都是首字母小写. // 构造函数,首字母大写 // 注意,这里并没有创建并返回一个对象,仅仅是初始化 function Range(from , to) { // 添加2个属性,这2个属性是不可继承的,每个对象都拥有唯一的属性 this.from = from; this.t

javascript基础知识-类和模块

在JavaScript中可以定义对象的类,让每个对象都共享这些属性. 在JavaScript中,类的实现是基于其原型继承机制的.如果两个实例都从同一个原型对象上继承了属性,我们就说它们是同一个类的实例. JavaScript中有一个重要特性是"动态可继承"(dynamically extendable),笔记之后再做. 为什么要定义类:定义类是模块开发和重用代码的有效方式之一. 1)类和原型 在JavaScript中,类的所有实例对象都从一个原型对象上继承属性.因此,源性对象是类的核心

JavaScript权威指南第09章 类和模块

类和模块 类的实现是基于继承机制的,如果两个类继承同一个原型对象,那么也就是说,也就意味着使用同一个构造函数来实例化,它们是同一个类的实例. 9.1类和原型 在javascript中,类的实例都是从同一个原型对象上继承属性,所以原型对象是类的核心. 9.2类和构造函数 构造函数是初始化新创建对象的函数. 构造函数的prototype属性被用作新对象的原型,因此,同一个构造函数的实例化的对象都继承自同一个对象. 9.3javasript中的java式的类继承 实例字段 实例方法 类字段 类方法 9

201506300917_《Javascript权威指南(第六版)——类和模块、定义类三步法、定义简单类的函数 》(P200-210)

一. 类和模块 1. 类的实现基于原型继承机制的. 二. 类和原型 三. 类和构造函数 1. 构造函数是用来初始化新创建的对象的. 2. 使用new,所以,构造函数只要初始化对象状态即可. 3. 构建构造函数即是定义类,所以首字母要大写. 4. 四. 构造函数和类的标识 五. constrctor属性 1. constructor属性的值是一个函数对象 例如: var F = function() {}; //这是一个函数对象: var p = F.prototype;  //原型对象 var

实现javascript下的模块组织

前面的话 java有类文件.Python有import关键词.Ruby有require关键词.C#有using关键词.PHP有include和require.CSS有@import关键词,但是对ES5版本的javascript来说,javascript通过script标签引入代码的方式显得杂乱无章,语言自身毫无组织和约束能力,人们不得不用命令空间等方式人为地约束代码,以求达到安全和易用的目的.本文将详细介绍javascript中的模块组织 反模式 反模式(Anti-Pattern)指没有使用任何

你需要知道的 JavaScript 类(class)的这些知识

作者: Dmitri Pavlutin译者:前端小智来源:dmitripavlutin 点赞再看,养成习惯 本文 GitHub https://github.com/qq44924588... 上已经收录,更多往期高赞文章的分类,也整理了很多我的文档,和教程资料.欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西. JavaScript 使用原型继承:每个对象都从原型对象继承属性和方法. 在Java或Swift等语言中使用的传统类作为创建对象的蓝图,在 JavaScript 中不

javascript类继承

function extend(subClass, superClass) { var f = function() {}; f.prototype = superClass.prototype; subClass.prototype = new f(); subClass.superClass = superClass.prototype; } var parent = function (name, age) { this._name = name; this._age = age; };