无为清净楼资源网 Design By www.qnjia.com
复制代码 代码如下:
/* Based on Alex Arnell's inheritance implementation. */
var Class = (function() {
//临时存储parent的prototype
function subclass() {};
//创建类的方法
function create() {
var parent = null, properties = $A(arguments);
//检查新建一个类时,是否指定了一个父对象
//如果指定了父类,赋值给parent
if (Object.isFunction(properties[0]))
parent = properties.shift();
//真正用作返回的类,在创建实例时,将调用initialize方法进行初始化
function klass() {
this.initialize.apply(this, arguments);
}
//给klass添加addMethods方法,在调用create方法之后
//仍可以调用addMethods方法进行类级别的方法扩充
Object.extend(klass, Class.Methods);
//给返回的类添加两个属性,superclass:父类,subclasses:子类的集合
klass.superclass = parent;
klass.subclasses = [];
//如果创建类时指定了父对象,则把klass的原型指向父对象的实例,实现原型链继承
if (parent) {
subclass.prototype = parent.prototype;
klass.prototype = new subclass;
//为父类添加子类,维护父类的子类集合
parent.subclasses.push(klass);
}
//向新类添加方法
for (var i = 0; i < properties.length; i++)
klass.addMethods(properties[i]);
//如果没有指定初始化方法,则默认把一个空方法赋给初始化方法
if (!klass.prototype.initialize)
klass.prototype.initialize = Prototype.emptyFunction;
/*
* 修正新类的构造函数,使得构造函数指向自己,这里特意说一下(如果注释掉下面这行):
* var Person=Class.create();
* var p1=new Person();
* alert(p1.constructor==Person) //true
* var Man=Class.create(Person)
* var m1=new Man();
* alert(m1.constrcutor==Man) //false
* alert(m1.constrcutor==Person) //true
* alert(m1.construcctor==p1.constrcutor) //true
*
* 看出问题来了吧?Man的构造函数竟然指向了Person的构造函数
* 问题的根源在klass.prototype = new subclass;这句话
* 具体原因我就不解释了,要详细理解的请查看《JavaScript语言精髓与编程实践》155~160页
*/
klass.prototype.constructor = klass;
return klass;
}
//把创建类时的方法添加到新类,或者在创建完类之后在添加类级别的方法
function addMethods(source) {
//取得新类的父类
var ancestor = this.superclass && this.superclass.prototype;
var properties = Object.keys(source);
//貌似下面的判断总是为真,不知道为什么这么写,知道的告诉我?
if (!Object.keys({ toString: true }).length) {
//如果新类重写了toString和valueOf方法则添加之
if (source.toString != Object.prototype.toString)
properties.push("toString");
if (source.valueOf != Object.prototype.valueOf)
properties.push("valueOf");
}
//遍历所有的新类声明中的方法
for (var i = 0, length = properties.length; i < length; i++) {
//property是函数名称,value是函数体
var property = properties[i], value = source[property];
//判断这个方法是否需要调用父类的同名方法
if (ancestor && Object.isFunction(value) &&
value.argumentNames().first() == "$super") {
var method = value;
//这里很重要!
//替换$super参数,使得这个参数指向父类的同名方法
//这里应用了Function的wrap方法,wrap方法的解释请参考【Prototype 学习——Function对象】
//method是新定义的方法,所以他的第一个参数为$super,然后从'='到'.'之间返回的是父类的同名方法
//最后调用wrap方法把$super参数替换成父类的同名方法,这样在子类调用$super()时,将调用父类的同名方法
//这里构造的非常棒!值得思考
value = (function(m) {
return function() { return ancestor[m].apply(this, arguments); };
})(property).wrap(method);
//将新产生的value(即经过修改过的子类方法)的valueOf和toString指向原子类的同名方法
//这里是在修正调用wrap方法之后的遗留问题
value.valueOf = method.valueOf.bind(method);
value.toString = method.toString.bind(method);
}
//把方法添加到新类中
this.prototype[property] = value;
}
return this;
}
//返回Class的可调用方法
return {
create: create,
Methods: {
addMethods: addMethods
}
};
})();
这个类就提供了2个方法:create和addMethods,上面的源码注释中已经说明的很清楚了,下面就看些例子,具体说明一下用法:
复制代码 代码如下:
//声明Person类,并定义初始化方法
var Person = Class.create({
initialize: function(name) {
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, {
// redefine the speak method
//注意这里的$super用法,在对照源码中的解释仔细看一下
say: function($super, message) {
return $super(message) + ', yarr!';
}
});
var john = new Pirate('Long John');
john.say('ahoy matey');
// -> "Long John: ahoy matey, yarr!"
复制代码 代码如下:
var john = new Pirate('Long John');
john.sleep();
// -> ERROR: sleep is not a method
// every person should be able to sleep, not just pirates!
//这里是addMethods的用法,可以在类级别扩充方法
Person.addMethods({
sleep: function() {
return this.say('ZzZ');
}
});
john.sleep();
复制代码 代码如下:
//这里是superclass和subclasses两个属性的用法
Person.superclass
// -> null
Person.subclasses.length
// -> 1
Person.subclasses.first() == Pirate
// -> true
Pirate.superclass == Person
// -> true
/* Based on Alex Arnell's inheritance implementation. */
var Class = (function() {
//临时存储parent的prototype
function subclass() {};
//创建类的方法
function create() {
var parent = null, properties = $A(arguments);
//检查新建一个类时,是否指定了一个父对象
//如果指定了父类,赋值给parent
if (Object.isFunction(properties[0]))
parent = properties.shift();
//真正用作返回的类,在创建实例时,将调用initialize方法进行初始化
function klass() {
this.initialize.apply(this, arguments);
}
//给klass添加addMethods方法,在调用create方法之后
//仍可以调用addMethods方法进行类级别的方法扩充
Object.extend(klass, Class.Methods);
//给返回的类添加两个属性,superclass:父类,subclasses:子类的集合
klass.superclass = parent;
klass.subclasses = [];
//如果创建类时指定了父对象,则把klass的原型指向父对象的实例,实现原型链继承
if (parent) {
subclass.prototype = parent.prototype;
klass.prototype = new subclass;
//为父类添加子类,维护父类的子类集合
parent.subclasses.push(klass);
}
//向新类添加方法
for (var i = 0; i < properties.length; i++)
klass.addMethods(properties[i]);
//如果没有指定初始化方法,则默认把一个空方法赋给初始化方法
if (!klass.prototype.initialize)
klass.prototype.initialize = Prototype.emptyFunction;
/*
* 修正新类的构造函数,使得构造函数指向自己,这里特意说一下(如果注释掉下面这行):
* var Person=Class.create();
* var p1=new Person();
* alert(p1.constructor==Person) //true
* var Man=Class.create(Person)
* var m1=new Man();
* alert(m1.constrcutor==Man) //false
* alert(m1.constrcutor==Person) //true
* alert(m1.construcctor==p1.constrcutor) //true
*
* 看出问题来了吧?Man的构造函数竟然指向了Person的构造函数
* 问题的根源在klass.prototype = new subclass;这句话
* 具体原因我就不解释了,要详细理解的请查看《JavaScript语言精髓与编程实践》155~160页
*/
klass.prototype.constructor = klass;
return klass;
}
//把创建类时的方法添加到新类,或者在创建完类之后在添加类级别的方法
function addMethods(source) {
//取得新类的父类
var ancestor = this.superclass && this.superclass.prototype;
var properties = Object.keys(source);
//貌似下面的判断总是为真,不知道为什么这么写,知道的告诉我?
if (!Object.keys({ toString: true }).length) {
//如果新类重写了toString和valueOf方法则添加之
if (source.toString != Object.prototype.toString)
properties.push("toString");
if (source.valueOf != Object.prototype.valueOf)
properties.push("valueOf");
}
//遍历所有的新类声明中的方法
for (var i = 0, length = properties.length; i < length; i++) {
//property是函数名称,value是函数体
var property = properties[i], value = source[property];
//判断这个方法是否需要调用父类的同名方法
if (ancestor && Object.isFunction(value) &&
value.argumentNames().first() == "$super") {
var method = value;
//这里很重要!
//替换$super参数,使得这个参数指向父类的同名方法
//这里应用了Function的wrap方法,wrap方法的解释请参考【Prototype 学习——Function对象】
//method是新定义的方法,所以他的第一个参数为$super,然后从'='到'.'之间返回的是父类的同名方法
//最后调用wrap方法把$super参数替换成父类的同名方法,这样在子类调用$super()时,将调用父类的同名方法
//这里构造的非常棒!值得思考
value = (function(m) {
return function() { return ancestor[m].apply(this, arguments); };
})(property).wrap(method);
//将新产生的value(即经过修改过的子类方法)的valueOf和toString指向原子类的同名方法
//这里是在修正调用wrap方法之后的遗留问题
value.valueOf = method.valueOf.bind(method);
value.toString = method.toString.bind(method);
}
//把方法添加到新类中
this.prototype[property] = value;
}
return this;
}
//返回Class的可调用方法
return {
create: create,
Methods: {
addMethods: addMethods
}
};
})();
这个类就提供了2个方法:create和addMethods,上面的源码注释中已经说明的很清楚了,下面就看些例子,具体说明一下用法:
复制代码 代码如下:
//声明Person类,并定义初始化方法
var Person = Class.create({
initialize: function(name) {
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, {
// redefine the speak method
//注意这里的$super用法,在对照源码中的解释仔细看一下
say: function($super, message) {
return $super(message) + ', yarr!';
}
});
var john = new Pirate('Long John');
john.say('ahoy matey');
// -> "Long John: ahoy matey, yarr!"
复制代码 代码如下:
var john = new Pirate('Long John');
john.sleep();
// -> ERROR: sleep is not a method
// every person should be able to sleep, not just pirates!
//这里是addMethods的用法,可以在类级别扩充方法
Person.addMethods({
sleep: function() {
return this.say('ZzZ');
}
});
john.sleep();
复制代码 代码如下:
//这里是superclass和subclasses两个属性的用法
Person.superclass
// -> null
Person.subclasses.length
// -> 1
Person.subclasses.first() == Pirate
// -> true
Pirate.superclass == Person
// -> true
三个例子几本覆盖了Class类的方法,详细例子请参考:http://prototypejs.org/learn/class-inheritance
无为清净楼资源网 Design By www.qnjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
无为清净楼资源网 Design By www.qnjia.com
暂无评论...
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
2024年11月17日
2024年11月17日
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】