`
shuxiang
  • 浏览: 26923 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

JS读书笔记(二)prototype

阅读更多

prototype给我的感觉一直是个十分神秘的东西,深不可测,高不可攀,几次想找机会高懂它,都是半途而废,这次也不能算是完全明白,但似乎比以前明白的多了些,就记录下来,希望以后有了新的感悟再回头比较一下,修证现在的记录

 

首先引用“名人”的话,解释一下:

  • prototype不仅仅是一种管理对象继承的机制,更是一种出色的设计思想。
  • javascript中对象的prototype属性,可以返回对象类型原型的引用。
  • “原型”是描述自然界事物之间“归类”类系的一种,另外几种关系包括“继承”、“接口”,一般来说,“继承”描述的是事物之间固有的衍生关系,能被“继承”所描述的事物之间具有很强的关联性(血缘)。“接口”描述事物功用方面的共同物征。而“原型”则倾向于描述事物之间的“相似性”。从这一点看,“原型”在描述事物关联性方面,比继承和接口更加广义。
  • 一个类型有且仅有一个原型(在默认情况下,该原型是一个object对象),而一个对象却可能有多个类型。

对象——类型——原型(对象)可能构成一个环状或者其他拓扑结构,这一特性给javascript带来了五花八门的用法:

  1. 给原型对象动态添加属性或方法(静态属性或方法区别于用this定义的公有属性和公有方法)
  2. 使用prototype创建大量副本(实质
var p1 = new Point(1,2);
var points = [];
var PointPrototype = function(){};
PointPrototye.prototype = p1;
for(var i =0;i < 1000; i++){
  //由于PointPrototype的构造函数是空函数,因此它的构造要比直接构造p1副本要快的多
  points[i] = new PointProptotype();
}

 

 将一个属性添加为prototype的属性,这个属性将被该类型创建的所有实例所共享,但是这种共享是只读的。在任何一个实例中只能够用自己的同名属性覆盖这个属性,而不能够去改变它。换句话说,对象在读取某个属性时,总是先检查自身域的属性表,如果有这个属性,则会返回这个属性,否则就去读取prototype域,返回prototype域上的属性。另外,javascript允许prototype域引用任何类型的对象,因此,如果对prototype域的读取依然没有找到这个属性,则javascript将递归地查找prototype域所指向对象的prototype 域,直到这个对象的prototype域为它本身或都出现循环为止。

 

prototype的特点是能够以某个类型为原型构造大量的对象。以prototype机制来模拟的继承是一种原型继承,它是javascript多种继承实现方式的一种。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics