搞不懂得js,说明白了分全给了,越明白越好

seesea125 2010-09-14 10:56:04
在js的基础上封装的,common.js如下
var Tecent = Tecent || {};
Tecent.Common = Tecent.Common || ((function() {
var Common = {
extend: function(base, obj) {
for (var i in base) {
obj[i] = base[i];
}
return obj;
},
Inheritance: function(base, obj) {
for (var i in base.prototype) {
obj.prototype[i] = base.prototype[i];
}
return obj;
}
}
Common.extend({
Trim: function() {
return this.replace(/^\s+/, '').replace(/\s+$/, '');
}
}, String.prototype);
window.Co = Common;
return Common;
})());
使用方法
Forms.Panel = Forms.Panel || ((function() {
var Panel = function(n, i) {
this.Init(n, i);
}
Tecent.Common.Inheritance(Forms.Base, Panel);//为什么要先这样继承,再接下来extend呢?
Co.extend({
Controls: null,
Init: function(n, i) {
this.Controls = [];
if (i == undefined) {
i = n;
this.Element = $('<span></span>');
}
else {
this.Element = $(n);
}
if (i) {
this.Show()
}
else {
this.Hide();
}
},

//添加一个控件到容器
Add: function(obj) {
if (obj.Element) {
this.Element.append(obj.Element);
this.Controls.push(obj);
}
else {
this.Element.append($(obj));
}
return this;
},
//删除容器//或容器内控件
Remove: M(function() {
this.Element.remove();
this.Controls = [];
}, function(obj) {
if (obj.Element) {
obj.Element.remove();
this.Controls.RemoveKey(obj);
}
else {
$(obj).remove();
}
})
}, Panel.prototype);

return Panel;
})());
1 为什么扩展和继承要这么写,可以这么写?而不是平时看书上说的,用call,或者apply去实现继承呢?extend是重写了jquery的方法吗?
extend: function(base, obj) {
for (var i in base) {
obj[i] = base[i];
}
return obj;
},
Inheritance: function(base, obj) {
for (var i in base.prototype) {
obj.prototype[i] = base.prototype[i];
}
return obj;
}
他们做了什么工作?为什么要这么做?
2 为什么panel的使用可以
var panel=new Forms.Panel()呢?
而var xyz = xyz || {};
xyz = xyz || (function() {
var refn = function(paramx,paramy) {
return paramx + paramy;
}
return refn;
} ());
debugger;
var thisxyz = new xyz();
这样却是错误的?其实这里错误我明白了,但刚才的panel明明定义后已经执行了,为什么还可以var panel=new Forms.Panel()呢?
...全文
252 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lawbc 2010-09-15
  • 打赏
  • 举报
回复
这个。。。。暂时还不会,我只会用
gs8716 2010-09-15
  • 打赏
  • 举报
回复
仔细看还是能看到一点眉目的,说起来就有点困难
even0220 2010-09-15
  • 打赏
  • 举报
回复
Mark
uP!
zeng563492220 2010-09-15
  • 打赏
  • 举报
回复
学了也不会!汗!
mark620 2010-09-15
  • 打赏
  • 举报
回复
MrSLin 2010-09-15
  • 打赏
  • 举报
回复
推荐个http://blog.csdn.net/niuyongjie/archive/2009/11/15/4810835.aspx#
还有,如果仔细看《JavaScript高级程序编程》里面3、4两章的有关对象和对象继承,就会很清晰了。
MrSLin 2010-09-15
  • 打赏
  • 举报
回复
0.怎么又是js的东西放到.net版面?
1.Inheritance和extend的先后还是必要的,虽然都是对Panel.prototype操作。Inheritance是把Form.Base.prototype中的属性和方法拷贝到Panel.prototype中,那么extend是对Panel.prototype的扩展,所以扩展的方法或属性可能会和从Form.Base.prototype中继承的重复,那么就需要重写覆盖掉。如果颠倒了,你先扩展,后继承,可能你扩展的方法都被父类的重写了,这肯定不是你想要的结果。
2.为什么扩展和继承要这么写?
这里的继承是通过原型prototype来实现的,call和apply其实是通过构造函数方式继承的,你可以看看call和apply的实现就明白了。怎么写都不重要,能实现功能就好了。我不知道extend是不是重写了jQuery的方法,但是我肯定,你把Inheritance和extend两个函数单独拉出来,可以实现对象间的继承,里面的写的也很简单、很明确,就是扩展么。
3.最后一个问题,另个帖子看到回了。
jshi123 2010-09-15
  • 打赏
  • 举报
回复
1.
Inheritance是把Form.Base.prototype中的所有成员复制到Panel中,让Panel具有Form.Base的特性,模拟实现继承。
extend是把一些新的属性和方法添加/覆盖到Panel.prototype中,让Panel在Form.Base基础上具有新的特性

2.
Forms.Panel是function,而xyz是对象,所以不能new
把Forms.Panel的定义里面的内容简化掉以后是这样的:
Forms.Panel = Forms.Panel || ((function() {
var Panel = function(n, i) {}
return Panel;
})());
这样可以看得比较清楚,执行外层的匿名方法后,返回的是内层的Panel变量,它是一个function,最终被赋予Forms.Panel,所以Forms.Panel就是一个function,可以new
  • 打赏
  • 举报
回复
仰视、 学习
lpc444 2010-09-14
  • 打赏
  • 举报
回复
学习了,我连如何编辑js文件都不知道...
q107770540 2010-09-14
  • 打赏
  • 举报
回复
关 注

62,248

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧