本文实例讲述了JS利用prototype给类添加方法操作。分享给大家供大家参考,具体如下:
1.如何定义一个简单的类?
以下是一个没有任何属性和方法的类的定义:
function MyClass(){};
你可能会想,这不就是个简单的函数声明?没错,这个函数就是一个类的定义的实现。如何使用这个类呢?看下面的代码:
var cls1 = new MyClass();
这样,利用new
就可以生成MyClass的一个实例了。所以在js中可以说函数就是类,类就是函数。
2.给类增加属性和方法
function MyClass(name,age){ this.name = name; this.age = age; } var cls1 = new MyClass("lily",18); alert(cls1.name);
从上面的代码可以看出,在函数内使用this就能给函数本身增加属性值。而在上面的代码中就给myClass函数增加了name和age属性。
同样,还可以利用this
给这个类增加一个 toString 方法,代码如下:
function MyClass(name,age){ this.name = name; this.age = age; this.toString() = function(){ alert(this.name +":"+ this.age); }; } var cls1 = new MyClass("liming",10); cls1.toString();
我们已经成功的给MyClass增加了toString方法。另外也可以用以下代码来添加方法:
function MyClass(name,age){ this.name = name; this.age = age; } var cls1 = new MyClass("liming",10); cls1.toString() = function(){ alert(this.name +":"+ this.age); }; cls1.toString(); // [liming:10] var cls2 = new MyClass("zhang",10); cls2.toString(); //报错
虽然这样也能给这个类添加一个方法,但这种方式只是给cls1这个实例增加了方法,并未给MyClass本身增加方法。
cls2并不存在toString方法。
3.引出prototype
从上面我们已经知道要给MyClss类的本身增加方法,需要讲方法定义在MyClass这个函数内部,这样的话,每声明一个新的实例,就会将MyClass本身复制一遍,这显然不是最优的做法。
既然不能将一个类(函数)所包含的方法都定义在函数的内部,那么,如何来给一个类添加方法呢?这就需要用到函数的prototype属性了。
每一个函数都会包含一个prototype属性,这个属性指向了一个prototype对象,我们可以指定函数对应的prototype对象。如果不指定,则函数的prototype属性将指向一个默认的prototype对象,并且次默认的prototype对象的constructor属性又会指向该函数。
当用构造函数创建一个新的对象时,新的对象会获取构造函数的prototype属性所指向的prototype对象的所有属性和方法,这样一来,构造函数对应的prototype对象所做的任何操作都会反映到它所生成的对象上,所有的这些对象将共享与构造函数对应的prototype对象的属性和方法。
虽然新创建的对象可以使用它的构造函数所指向的prototype对象的属性和方法,但不能像构造函数那样直接调用prototype对象(对象没有prototype属性)。
简而言之,就是如果我们使用函数的prototype对象来给函数添加方法,那么在创建一个新的对象的时候,并不会复制这个函数的所有方法,而是指向了这函数的所有方法。
具体看下面的代码:
function MyClass(name,age){ this.name = name; this.age = age; } MyClass.prototype.toString = function(){ // } var cls1 = new MyClass("liming",10); cls1.toString(); // var cls2 = new MyClass("zhang",10); cls2.toString();
如果要加入多个方法,也可以使用下面的方式:
function MyClass(name,age){ this.name = name; this.age = age; } MyClass.prototype = { toString:function(){ // }, sayHellow:function(){ // } };
这就是js中给类添加方法的实现,它是利用prototype来实现封装的。
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]