prototype和closure是js中两个不好搞懂的概念,幸好网上有很多相关的文章,在网上查了一遍以后,总是是觉得有点理解了。今天先说说prototype。
之前一直被ajax in action中文版附录里的一篇文章误导,该文有这样一段讲述
function MyObject(){ 

MyObject.prototype.color = "red"; 
var obj1 = new MyObject();

MyObject.prototype.color = "blue"; 
MyObject.prototype.soundEffect = "boOOoing"; 
var obj2 = new MyObject();

文中称上述代码执行后,obj1的颜色为红色,obj2颜色为蓝色。这是错误的!
实际上,obj1,obj2的color属性,都为蓝色!
同时这篇文章还说,prototype和new关键字协同工作,当使用new调用函数时,函数prototype的所有属性和方法会附加到结果对象上。这段话很容易让人产生一个误解,就是结果对象本身会拥有函数的prototype上的属性和方法,而实际上,不是的。
prototype的能力并不是往结果对象上添加东西,prototype只不过拥有可以被找到的能力而已!代码
function MyObject(){ 

MyObject.prototype.x = 1; 
var obj = new MyObject(); 
alert("obj.x="+obj.x);
这里我们没有给obj添加属性x,但是可以得到obj.x = 1,因为当js在对象obj自身的属性中找不到属性x的时候,便会到生成obj对象的构造函数MyObject的prototype属性中去找,于是,找到x=1。看代码
function MyObject(){  
}  
MyObject.prototype.x = 1;  
var obj = new MyObject();  
alert("obj.x="+obj.x); 
MyObject.prototype.x = 2; 
alert("obj.x="+obj.x);
这里先弹出obj.x = 1,然后弹出obj.x = 2,说明obj.x实际上找到的是MyObject.prototype.x。
问题来了,我们可以通过obj找到MyObject.prototype的属性,那么,可不可以修改勒?
function MyObject(){    
}    
MyObject.prototype.x = 1;    
var obj = new MyObject();    
obj.x = 2; 
alert(MyObject.prototype.x); //弹出 1 
MyObject.prototype.x = 3; 
alert(obj.x);//弹出2 
delete obj.x; 
alert(obj.x)//弹出3
当执行了obj.x =2;以后,修改MyObject.prototype.x的值无法影响obj.x了,因为obj.x=2;这一步赋值操作,会给obj这个对象自己添加属性x,于是我们现在就有两个x,obj自己的,和MyObject.prototype的,当时调用obj.x时,js当然会优先使用对象自己的属性。接下来的代码也好理解了,删除obj自己的x后,调用obj.x时又去找构造函数MyObject的prototype的x,于是找到3。
ok,接下来,看复杂一点的例子。
function MyObject1(){ 

MyObject1.prototype.x = 1;

function MyObject2(){ 

MyObject2.prototype = new MyObject1();

var obj = new MyObject2(); 
alert(obj.x);

 
恩,js的原型继承,我们不是说这个,我只是简单的想只到,obj怎么找到x的。按照前面的解释,obj本身没有x,去找构造函数,这里是MyObject2的prototype,这里有点不一样了,MyObject2.prototype被赋予了一个值,MyObject1的一个实例。那么,MyObject2.prototype.x是不是就相当于(new MyObject1()).x,如同前面的讨论,不就是找到 了MyObject1.prototype.x!同理,如果MyObject1.prototype也是其他类的实例,那就接着往下找就是了,这就是所谓的prototype chain。
那么如果在MyObject1里面也没有定义x,是不是就不往下找了?不是的,这个链的终点,是Object.prototype,如果在Object.prototype中都没有找到属性x的定义,js才会很肯定的告诉你,obj.x没有被定义。
 
小结一下,prototype到底是什么?
prototype是js中函数(Function)对象的一个属性,本身也是一个对象,当我们新建一个函数的同时,也新建了该函数的prototype对象,我们也可以让这个prototype属性指向其他的对象。它的能力是可以把自己的属性给拥有它的函数的实例使用。
 
呵呵,我的这段总结真拗口啊……
提两个问题:
1:能不能把js内置对象的prototype属性指向别的对象!
2:两个类循环引用prototype会怎么样?
 
先来看一个问题,告诉大家答案是不能!
function MyObject(){} 
Array.prototype = new MyObject(); 
alert(Array.prototype.constructor);
弹出的依然是Array自己的构造函数,赋值是失败的。
 
第二个问题,看代码~
function MyObject1(){} 
function MyObject2(){} 
MyObject1.prototype = new MyObject2(); 
MyObject2.prototype = new MyObject1();
 
看着有点觉得变态啊,这样写也不会有什么问题,没有死循环,应该是被优化了,两个类和谐共处,跟一家人似的。
 

Javascript学习笔记--理解prototype的更多相关文章

  1. Java程序猿的JavaScript学习笔记(5——prototype和Object内置方法)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  2. Java程序猿的JavaScript学习笔记(8——jQuery选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  3. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  4. Java程序猿的JavaScript学习笔记(1——理念)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  5. Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  6. Java程序猿的JavaScript学习笔记(6——面向对象模拟)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. Java程序猿的JavaScript学习笔记(汇总文件夹)

    最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...

  8. Java程序猿JavaScript学习笔记(2——复制和继承财产)

    计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...

  9. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

随机推荐

  1. 解决连锁零售行业IT运维管理四大困境

    解决连锁零售行业IT运维管理四大困境   中国近年来,连锁零售行业进入了行业的发展高潮,迅速崛起一批大型连锁业态.而随着IT技术的不断进步,连锁零售企业已经步入IT信息化快速发展的重要阶段:在面对激烈 ...

  2. Java如何显示工作日(周一至周五)的名称?

    在Java中,如何显示工作日(周一至周五)的名称? 此示例使用DateFormatSymbols().DateFormatSymbols类的getWeekdays()方法来显示工作日(周一至周五)的简 ...

  3. (原)多线程sdl_ttf显示文字

    最近在使用sdl做视频显示,因为需要显示文字,所以就找了sdl的拓展库,sdl_ttf来做文字显示. 这里说明一下:sdl_ttf不支持多线程,官方上面有说明,它不是多线程安全的. 所以当我最初使用s ...

  4. server的响应数据

    前言 如果使用了MVC框架(比方,struts2). server的响应数据.分3种情况 1.响应数据是结果页面 2.响应数据是json格式的数据 3.响应数据是json格式的数据,然后再又一次发出一 ...

  5. html常用对照表

    常用对照表:http://tool.oschina.net/commons

  6. mothur 计算稀释性曲线

    在微生物分析中,经常使用稀释性曲线来评估测序量是否足够:可以使用mothur 这个软件来完成 rarefaction.single 命令用来做稀释性曲线,既可以对单个样本单独分析,也可以一次对多个样本 ...

  7. 9款赏心悦目的HTML5/CSS3应用特效

    经过几天的收集,在html5tricks网站上又增加了不少HTML5的教程和应用,今天我把几款赏心悦目的HTML5/CSS3应用特效总结了一下,一共9款HTML5特效,分享给大家. 1.HTML5 W ...

  8. SqlServer2008基础知识:安全与权限

    分享自 儒雅的男人blog http://www.cnblogs.com/yushaoye201314/archive/2013/04/19/3031203.html 好文,转载收藏 这两天在调用Mi ...

  9. Linux服务器svn与项目同步

    命令:svn checkout svn://192.168.67.131/trunk/w1

  10. 【WP8】换肤功能的实现

    主题功能在移动开发中是最常见的功能之一,用的最多的是日间模式和夜间模式的切换,下面说说如何在WP上使用主题,不同主题的差别无非就是两种(颜色和图片),在WP上我们通常使用资源来设置颜色,系统提供了两种 ...