?prototype.js 深入学习(fn) javascript 的面向对象特?/font>
1.怎样构?初始?对象?
pP初始化了一个对?名字叫 Prototype)Q以?qing)对象的四个成? Version, ScriptFragment, emptyFunction, K
我们也来试试:
于是你可以这样用:(x) bbs.name ?bbs.sayHello()
看到吗? sayHello 是一个方法哦Q不要惊慌,"一切都是对?Q所以它?name 是一L(fng)Q只不过初始化,或定义的语法不一栗想?js 中的正则表达式中的那两个杆杆了吗Q?可爱吧!
Ҏ(gu)是对象,所以它可以被当作参C递,或者作为方法的q回倹{?/p>
所?Prototype 中有一?Version 属性,q有一个匹?script 的正则式字符Ԍ 一个空Ҏ(gu)emptyFunctionQ还有一个方?K, 它仅仅返回参数?/p>
没问题吧Ql!
2. 构造函敎ͼ
先让我们写段代码?中学Ӟ我语文极?大学没语文了)Q我惛_代码让你们明白我心里真实的想?Q?/p>
先看l果Q?br />?alert(bencode.name); 可以知道Qbencode是对象, ?name 是 bencode 的属性, 它被正确地初始化?"bencode"
所?var bencode = new Persion("bencode"); 是构造了一个新的对象,Person() 相当于构造函?/p>
所?new q个关键字, 是构造一个新的对象,q且在这个对象上调用相应的方法,q将q个对象q回?/p>
按上面说Q?Ҏ(gu) 如果用在 ?new 后面Q就相当于成了构造函C?/p>
话又说回来了Q?如果 var bencode = new Persion("bencode") ?构造了一个对象,像Java, 那么 Person 是不是类呢?
可是 Person 不是Ҏ(gu)吗? 可是Ҏ(gu)不也是对象吗Q?cM是对象?
一切皆对象?
本来无一物!
好了Q看 prototype.js?/p>
初始化一?Class 对象Q?它有一个成员,是一个方法, q个Ҏ(gu)q因另一个方法(Ҏ(gu)是对象,所以可以作为参数或者返回|
所以如果我们这么做Q?
上面分析_(d) A相当于类Q?哈哈 Class.create(); // l于名副其实
var a = new A(...); // 也是相当地直观, 是构造一个新的对象,cd 是A
new 操作W构造了对象Qƈ调用?Ҏ(gu)Q?q个Ҏ(gu)到底做了什么呢Q?也就是上面没有分析的东东Q看看先Q?/p>
[1]. new 操作W,׃(x)在新产生的对象上调用q个Ҏ(gu)
[2]. 哦? q里是调用 this 对象上的 initializeҎ(gu)Q?q传?arguments
换句话说Q就是把构造的d委托l?initialize Ҏ(gu)
initialize? 哪里来? 见下面,cȝ扩展(l承)
3. prototype?
看段老代码:(x)
bencode不是一个自闭的人,他应该可以向javaeye介绍一下自己?br />像这P(x)
假如不能实现以上功能的话Q?上面?newQ上面所有的东东都等于垃圾?/p>
所以。需要给 Person cd"实例Ҏ(gu)"
题外话:(x) 静态方法如何添加? 看上面的 Class.create, 仅仅是一个对象的成员而已
好, 再来一D?(Z完整性,上面的几句话Q再抄一?
q行代码Q通过Q?/p>
prototype是啥Q?h时忘?Prototype(prototype.js) q个库,名字一栯已Q?/p>
让我们再从结果上d析(W一ơ我们用q种Ҏ(gu)分析而得Z new 的作用)Q?/p>
我们在思考:(x)
要想 bencode.sayHello() 正常q行
bencode 是一个对? q是我们已经知道?br /> sayHello() 应该?bencode q个对象的方法才可以
可是bencode q个对象?new 操作W生的, ?new 此时作用?Person q个 "c?
那么Q?哦? 那么有两U可?
1. new 产生的那个新对象是不是就?Person.prototype
2. Person.prototype 中的成员 会(x)?new 操作W添加到 C生的对象?
再看:
this.name, q里?this 指什么?所以第一个可能讲不通呀
回忆赯D:(x)
如果q里?this 代表着C生的对象的话?br />那么W二U情况就讲得通了Q?new 会(x)?Person.prototype q个对象的成员放?q个新对象中?与当前行为相W?/p>
所以:(x) Person ?prototype 对象中的 成员, 会(x)被添加到 C生的对象 ?我是q样理解?
(不知?Js解释器是不是开源的Q?有空我得ȝ看,怎么实现的?
嘿,默认?prototype 是 Object 哦!
4. 扩展Q承?
什么是扩展Q啥是承? ! 我从爸爸那得C什么?
想不通!
q是实际点:(x)
有一个类A, 它有一?sayHelloҎ(gu)
我想构造一?B c,让他l承 A 对象Q?q句话太抽象?
其实我们可能惌P(x)
q应该是l承的第一层含义(重用Q?/p>
怎么办到呢?
var B = function() { // q里是有一个BcM
}
怎么h?实例Ҏ(gu)"? 快点惌v prototype!!!
B.prototype = A.prototype
q样行了吗? 恭喜, q行通过Q?/p>
让我们整合一?/p>
可是如果 B 是这样呢?
我们是不是应该将 A.prototype 中的内容d?B.prototype 对象中,而不是代替它呢? 当然?/p>
q样才能"扩展"
题外话?多态在哪里Q?嘿嘿
好了Q够多了, 那prototype.js 是怎么?扩展"的呢Q?/p>
q个只是单地?source 的成员, d?destination 对象中嘛, 哪里看得出扩展?
如果我这样呢Q?/p>
回忆刚才?Class.create()Q?/p>
刚才说过Q?调用 new Ӟ 会(x)创徏一个新对象Qƈ且调?Person Ҏ(gu)Q?Person Ҏ(gu)?x)委托?"C生对??initializeҎ(gu)
怎么L(fng)C生对象添?initialize Ҏ(gu)Q?哈哈Q轻?/p>
所以, 我们使用 prototype 创徏cM般格式是q样的:(x)
如果我们要承一个类Q只要:(x)
面向对象部分基本上就q样?/p>