javascript中类的创建和继承(2)
作者:yring 来源:经典论坛 发布时间:2008-05-08 12:07:00
标签:类,prototype,继承,javascript
prototype.js中的类定义和继承
相关推荐:
1.6.0以前:
/** obsolete syntax **/
var Person = Class.create(); //通过Class.create方法创建空类
Person.prototype = { //把方法定义到prototype中,注意,是通过initalize方法初始化类的属性
initialize: function(name) {
this.name = name;
},
say: function(message) {
return this.name + ': ' + message;
}
};
var guy = new Person('Miro');
guy.say('hi');
// -> "Miro: hi"
//prototype中的继承方式:
var Pirate = Class.create(); //建立空类;
// inherit from Person class:
Pirate.prototype = Object.extend(new Person(), { //先实例化超类,再把超类中的方法复制到子类中去,
// redefine the speak method //注意,实际上prototype类定义机制中并没有直接定义
say: function(message) { //类的属性而是通过intilize方法,而且所有的方法都
return this.name + ': ' + message + ', yarr!'; //之直接定义在prototype中,所以直接用原型链方式
} //继承超类的所有方法不会产生问题。
});
var john = new Pirate('Long John');
john.say('ahoy matey');
// -> "Long John: ahoy matey, yarr!"
/** obsolete syntax **/
var Person = Class.create(); //通过Class.create方法创建空类
Person.prototype = { //把方法定义到prototype中,注意,是通过initalize方法初始化类的属性
initialize: function(name) {
this.name = name;
},
say: function(message) {
return this.name + ': ' + message;
}
};
var guy = new Person('Miro');
guy.say('hi');
// -> "Miro: hi"
//prototype中的继承方式:
var Pirate = Class.create(); //建立空类;
// inherit from Person class:
Pirate.prototype = Object.extend(new Person(), { //先实例化超类,再把超类中的方法复制到子类中去,
// redefine the speak method //注意,实际上prototype类定义机制中并没有直接定义
say: function(message) { //类的属性而是通过intilize方法,而且所有的方法都
return this.name + ': ' + message + ', yarr!'; //之直接定义在prototype中,所以直接用原型链方式
} //继承超类的所有方法不会产生问题。
});
var john = new Pirate('Long John');
john.say('ahoy matey');
// -> "Long John: ahoy matey, yarr!"
来看一下Class.create方法的实现代码
var Class = {
create: function() {
return function() { //实际上把所有的属性定义到intiliaze方法(实际上是一个类)中,
this.initialize.apply(this, arguments); //然后通过对象冒充方式继承该类
}
}
}
var Class = {
create: function() {
return function() { //实际上把所有的属性定义到intiliaze方法(实际上是一个类)中,
this.initialize.apply(this, arguments); //然后通过对象冒充方式继承该类
}
}
}
可以从prototype的例子充分体会到通过对象冒充和原型链类继承的差别,一般来说属性需用对象冒充方式继承,方法需用原型链方式继承。
prototype-1.6.0以后版本:
Java代码
1.6.0以后,对prototype的类进行了更多的扩展,举例:
/** new, preferred syntax **/
// properties are directly passed to `create` method
var Person = Class.create({
initialize: function(name) { //不必定义一个空类,and定义方法的位置改变
this.name = name;
},
say: function(message) {
return this.name + ': ' + message;
}
});
// when subclassing, specify the class you want to inherit from
var Pirate = Class.create(Person, { //第一个参数是class,作为超类在定义类时直接继承
// redefine the speak method
say: function($super, message) {
return $super(message) + ', yarr!';
}
});
var john = new Pirate('Long John');
john.say('ahoy matey');
// -> "Long John: ahoy matey, yarr!"
1.6.0以后,对prototype的类进行了更多的扩展,举例:
/** new, preferred syntax **/
// properties are directly passed to `create` method
var Person = Class.create({
initialize: function(name) { //不必定义一个空类,and定义方法的位置改变
this.name = name;
},
say: function(message) {
return this.name + ': ' + message;
}
});
// when subclassing, specify the class you want to inherit from
var Pirate = Class.create(Person, { //第一个参数是class,作为超类在定义类时直接继承
// redefine the speak method
say: function($super, message) {
return $super(message) + ', yarr!';
}
});
var john = new Pirate('Long John');
john.say('ahoy matey');
// -> "Long John: ahoy matey, yarr!"
实现的代码比较复杂,但是基本原理和1.60以前版本差不多,也是用对象冒充继承initialize类,用原型链继承超类的方法,不过中间定义了一个klass对象,类似于工厂函数的方式


猜你喜欢
- 发现问题当我用pip安装好opencv-pyton后,我激动得在python项目中导入cv2就像这样:import cv2 as cvbut
- 说到排序,很多人可能第一想到的就是sorted,但是你可能不知道python中其实还有还就中方法哟,并且好多种场景下效率都会比sorted高
- opencv OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac
- 本文实例讲述了python实现获取序列中最小的几个元素。分享给大家供大家参考。具体方法如下:import heapq import rand
- 本文实例讲述了Python实现的读取文件内容并写入其他文件操作。分享给大家供大家参考,具体如下:文件目录结构,如图:read_file.py
- 如果字典中存储了一些值,我想要取出来该怎么操作呢?1、我要取出字典中所有的键-值对取出字典中所有的键-值对时,可以使用items()返回一个
- Null模式我想每个人都有一种经历,为了获取某属性,但是有时候属性是None,那么需要你做异常处理, 而假如你想节省这样的条件过滤的代码,可
- 大家好,我是小五前一阵给大家分享了,Python如何给图片加水印。评论区就有小伙伴问,可不可使用Python去除图片水印的方法呢?这个肯定有
- 这篇文章主要介绍了Python魔法方法 容器部方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 学习了css一段时间,现在对css的一些技巧进行一次小结.希望能对那些刚学习css的新手们带来帮助.一、关于注释在创建xhtml+CSS网站
- 我们现在回到函数上。记得我们用 SUM 这个指令来算出所有的 Sales (营业额)吧!如果我们的需求变成是要算出每一间店 (store_n
- 报表服务器数据库可以为一个或多个报表服务器实例提供内部存储。因为报表服务器数据库架构可能会因为推出新的 Reporting Services
- 那么四年一度的世界杯即将要在卡塔尔开幕了,对于不少热爱足球运动的球迷来说,这可是十分难得的盛宴,而对于最后大力神杯的归属,相信很多人都满怀着
- 前言本章介绍pandas中的缺失数据,主要内容有:pandas中对np.nan的操作: 统计 、 删除 、 填充 、 插值 pan
- 根据"客服果果"的"十几行的超简日历组件"http://bbs.51js.com/viewthrea
- 本文实例讲述了python将MongoDB里的ObjectId转换为时间戳的方法。分享给大家供大家参考。具体分析如下:MongoDB里的_i
- golang常用库:gorilla/mux-http路由库使用golang常用库:配置文件解析库-viper使用golang常用库:操作数据
- 本文实例讲述了JS+php后台实现文件上传功能。分享给大家供大家参考,具体如下:一、利用 FormData 对象形式上传FormData 是
- 这个标题实在拗口,Javascript命名变量所遵循的规则1、第一个字符必须是字母、汉字字符、 下划线(_)或美元符号($)2、剩下的可以是
- 1、最小二乘也可以拟合二次函数我们都知道用最小二乘拟合线性函数没有问题,那么能不能拟合二次函数甚至更高次的函数呢?答案当然是可以的。下面我们