对于Javascript的初学者来说,Prototype是个蛮高深的话题,其实并不尽然。
我说不尽然,意思是说理解Prototype的一般用法很简单。但是真正能做到融会贯通理解Prototype确实是件很难的事情。
今天我就从Prototype的基本开始讲。上文中我讲了原型模式。其实在Javascript中原型也是这个意思。Javascript中对象的原型属性的解释是:返回对象类型原型的引用。这是一个晕人的解释。其实就是指定了一个需要复制的对象。
文字再多也不如代码,上代码,说最简单的,任何类都继承自Object类:
function A()
{ }
A.prototype=new Object();
其实这样就相当于Object对象是A的一个原型,这样就相当于了把Object对象的属性和方法复制到了A上,和原型模式的精髓一样吧!
好,大概了解了prototype的基本用法,我们来看看原型究竟有什么用处。
最简单的用法,动态扩展类的方法和属性。
function People()
{
this.Jump=function(){
alert("I can jump");
}
}
现在要扩充方法:
People.prototype.Run=function(){
alert("I can run,too");
}
好,测试下:
var p=new People();
p.Jump();
p.Run();
接下来,顺带讲一下Javascript的方法种类。我个人将Javascript的方法分为三种:
<1>类方法
<2>对象方法
<3>原型方法
先看代码,后讲区别:
function People(name)
{
this.name=name;
//对象方法
this.Introduce=function(){
alert("My name is "+this.name);
}
}
//类方法
People.Run=function(){
alert("I can run");
}
//原型方法
People.prototype.IntroduceChinese=function(){
alert("我的名字是"+this.name);
}
测试下:
var p1=new People("Windking");
p1.Introduce();
People.Run();
p1.IntroduceChinese();
总结下:
名称
|
位置
|
格式
|
类方法
|
类外
|
类名.方法名
|
对象方法
|
类内
|
this.方法名
|
原型方法
|
类外
|
类名.prototype.方法名
|
我们用C#来做类别来讲解这三个方法:
类方法其实就是我们讲的静态方法:
如public static void Run(){}
而对象方法其实就是实例方法。
public void Introduce(){}
而原型方法有所不同,由于C#中不允许动态为对象增加方法,因此在C#中并不存在原型方法。原型方法处于C#的静态方法与实例方法之间,通过对象调用,但是存储的内存形式却类似于静态方法,也就是所有实例对象共享同一副本。
(ps:尽量将方法定义为原型方法,原型方法避免了每次调用构造函数时对属性或方法的构造,因此比较节省空间和时间)
p1.IntroduceChinese();创建对象。
还记得我在上一篇文章里讲的浅复制么?为什么大家都喜欢批量生产?效率是最主要因素。浅复制也一样,我们为什么要浅复制,因为效率高。作为原型模式的Javascript应用,prototype也承担着这样的重任。用prototype来创建对象,要比其他方式快得多。
看代码例子:
function People(name,age)
{
this.name=name;
this.age=age;
}
var p1=new People("Xuan",22);
var girls=[ ];
var GirlPrototype=function(){};
GirlPrototype.prototype=p1;
for(var i=0;i<100000;i++)
{
girls[i]=new GirlPrototype();
}
玩转继承:
Prototype最大的应用其实还是在于玩转继承,这个在此不讨论,请参加我的另一篇文章:《Javascript玩转继承(二)》。
好,基本的应用说完,下面我来说一下prototype的天使和魔鬼两面。
说prototype是天使,是因为以上的几点应用,让Javascript增加了很大的灵活性,尤其原型继承,更是Javascript最多的继承方式。
分享到:
相关推荐
《Javascript玩转Prototype.doc》专门聚焦于Prototype这一关键概念。Prototype是JavaScript中的一种特性,它使得对象能够共享属性和方法。这份文档可能会详细解释prototype属性、__proto__属性、以及如何通过改变...
JavaScript的继承主要通过原型链(prototype chain)来实现,这与基于类的继承语言有所不同。 在基于类的语言中,如C#,我们可以定义一个基类(如`Animal`),然后创建派生类(如`People`和`Girl`),通过类之间的...
原型继承是通过修改对象的`prototype`属性来实现的,使得子类可以访问父类的方法和属性。这种方式的优势在于代码结构清晰,易于理解和实现,同时支持实例化。然而,原型继承也有其局限性。例如,当父类构造函数需要...
然而,JavaScript 为了弥补这一不足,引入了其他的方式来实现继承,比如使用原型链(Prototype Chain)、寄生构造函数(Parasitic Constructor Pattern)、组合继承(Composition Inheritance)、原型式继承...
对于继承,JavaScript有一些独特的实现方式,因为其基于原型(prototype-based)的机制。 在传统的面向对象语言中,如C#,继承可以通过类(class)来实现,例如: ```javascript class Animal { Run() { alert(...
当我们使用`new`关键字调用构造函数时,会创建一个新的对象,并将其`[[Prototype]]`链接到构造函数的`prototype`属性上。 让我们深入探讨JavaScript中的构造函数和原型对象: ```javascript function Person(name)...
本文将通过实例讲解如何“玩转”Date对象。 1. **创建Date对象** 创建Date对象通常有两种方式: - 不传参数:`new Date()`,这将返回当前时间的Date对象。 - 传入参数:`new Date(milliseconds)`,其中...
最后,为了增加游戏的可玩性,我们还需要实现方块的随机生成。这可以通过定义一个预设的方块形状池,然后使用JavaScript的`Math.random()`函数选择一个形状来实现。 总结来说,使用JavaScript实现俄罗斯方块,主要...
每一个函数在创建时,JavaScript引擎都会自动为它创建一个prototype属性,该属性指向原型对象。原型对象在JavaScript中是实现继承的关键,所有通过同一个构造函数创建的对象都共享同一个原型对象上的属性和方法,这...
jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。 jQuery 是作为 ...
2. **JavaScript中的正则匹配**:在JavaScript中,我们可以使用`String.prototype.match()`方法来查找字符串中与正则表达式匹配的部分。例如,`var matches = code.match(/\bfunction\b/g);`会找到所有独立的...
7. Prototype.js:这是一个JavaScript库,提供了面向对象编程的扩展,如类、继承、观察者模式等功能。在这个项目中,它可能用来优化代码结构,方便对象的创建和管理。 8. img:这是一个包含游戏图片资源的目录,...
总的来说,"Class28"的开发涉及了JavaScript的面向对象编程、类继承、Canvas API图像处理等技术,这些都构成了"愤怒的小鸟"第2.5阶段的核心玩法和视觉体验。通过深入学习和实践这些知识点,开发者可以构建出更加复杂...
通过这个简单的实现,我们可以玩转文字中继游戏。然而,实际应用中可能需要考虑更多情况,比如处理重复词、空字符串或者异常情况。这个例子展示了如何利用JavaScript的基本数据结构和方法来解决实际问题,对于初学者...
学习JS蓬松的鸟参照的Flappy Bird,大致的知识点类,DOM事件,计时器,画布几个知识点的加深理解 var that = this的作用(闭包,this指针)目前还有几个常量不是很理解,玩起来速度有点快JavaScript30第一天:...
当前时间Array.prototype.forEach 单击此处检查布局。。CSS 转换: 旋转() 转换原点过渡计时功能: 三次贝塞尔曲线JS .getSeconds() .getMinutes() .getHours() 元素样式 单击此处检查布局。 第三天:CSS...