注:原文 http://www.2cto.com/kf/201406/307790.html

这里作为学习,写在这里

在面向对象的方式编写js脚本时,定义实例的方法主要有两种:this.XXX = function()P{ 和 function.prototype.XXX= function(){}

function ListCommon2(afirst)
{
var first=afirst;
this.do1=function ()
{
alert("first do"+first);
} }
ListCommon2.prototype.do2=function()
{
// alert("first do"+first);//会出错,不能访问first
this.do1(); // 通过调用 都do1()方法,间接的来访问 first属性。
}

  this.do1=function ()和ListCommon2.prototype.do2=function()有什么区别呢?

都相当于类的实例方法,只有new后才能使用,那有什么区别呢?

测试代码:

var t2=new ListCommon2("烧水2");
t2.do1();//
t2.do2();//

  经过测试发现:this.do1可以访问构造函数内部的变量first,而ListCommon2.prototype.do2不能访问,但能访问函数this.do1。

如果把ListCommon2.prototype.do2定义在构造函数内部,也就可访问了。

function ListCommon2(afirst)
{
var first=afirst;
this.do1=function ()
{
alert("first do"+first);
}
ListCommon2.prototype.do2=function()
{
alert("first do"+first);//定义在内部,就可以访问 first
// this.do1();
}
//实际上,讲ListCommon2.prototype.do2写在类内部,是没有意义的,直接 这样写 this.do2 = ..就可以了,向上面的do1一样。
    //故 function.prototype.do2 = function(){....},一般写在“类”的外部,用来实现向 类 语言(如php)的继承特性,封装特性。do2()方法相当于类内部的方法(类体内的方法,类内部的方法),do1()相当于定义在类体外(子类,对象)的方法。
} //测试代码
var t2=new ListCommon2("烧水2");
t2.do1();//
t2.do2();//

  

但作为实例函数,如果定义在构造函数内部,每次实例化都要执行,显然在浪费内存,也不合理。

有些资料上把this.do1这类方法叫做特权方法,主要是为了访问内部的私有字段,这样就可以控制对某些字段的访问。例如如上,就定义了一个私有字段first,只能通过构造函数传递,然后就不能修改了。

ListCommon2.prototype.do2这类方法相当于类的实例方法,但能访问这些特权方法,间接访问私有字段。

结论:

如果要直接访问私有字段,应该使用特权方法,也就是this定义的方法,应该定义在构造函数内部。相反,如果不需要直接访问私有字段,应该使用prototype定义的方法,而且应该定义在构造函数外部。

javascript之定义函数时 this 和prototype区别的更多相关文章

  1. JavaScript 中定义变量时有无var声明的区别

    关于JavaScript中定义变量时有无var声明的区别 var a=5; //正确 a=5; //正确 在javascript中,以上两种方法都是定义变量的正确方法.微软的Script56.CHM中 ...

  2. javascript使用parseInt函数时需要注意的一些问题

    这个问题大家可能会忽视,我在项目中就遇到了.写了提醒一下大家!!! 在用javascript的parseInt函数时,parseInt("08")或者parseInt(" ...

  3. python定义函数时的默认返回值

    python定义函数时,一般都会有指定返回值,如果没有显式指定返回值,那么python就会默认返回值为None, 即隐式返回语句: return None 执行如下代码 def now(): prin ...

  4. python定义函数时默认参数注意事项

    如果在调用一个函数时,没有传递默认参数,则函数内的默认参数是对函数的默认参数属性__defaults__的引用, 如 def func(arg1=[]): arg1.append(2) 调用func时 ...

  5. python定义函数时的参数&调用函数时的传参

    一.定义函数: 1.位置参数:直接定义参数 2.默认参数(或者关键字参数):参数名 = "默认值" 3.位置参数必须在默认参数之前 二.调用函数: 1.按位置传,直接写参数的值 2 ...

  6. 简要描述 JavaScript 中定义函数的几种方式

    JavaScript 中,有三种定义函数的方式: 1.函数语句:即使用 function 关键字显式定义函数.如: function f(x){ return x+1; }  2.函数定义表达式:也称 ...

  7. Python中定义函数时参数有默认值的小陷阱

    在定义函数的时候,如果函数的参数有默认值,有两种类型的参数,一种是整数,字符串这种不可变类型,另一种是列表这种可变类型,对于第一种情况没有什么特殊的地方,但是对于可变类型,有一个微妙的小陷阱. 可变类 ...

  8. [译]javascript中定义函数的各种方法

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  9. JavaScript中定义函数的几种方式

    函数的组成:函数名 + 函数体 1.使用function关键字定义函数 -- 具有优先级,优先将function关键字定义的函数优先执行 function  functionName(arg0, ar ...

随机推荐

  1. 学习笔记——责任链模式ChainOfResponsibility

    责任链模式,主要是通过自己记录一个后继者来判断当前的处理情况.Handler中,再增加一个方法用于设置后继对象,如SetHandler(Handler obj). 然后Handler类以其子类的处理方 ...

  2. c语言-扑克牌小魔术

    /************************************* Copyright(C) 2004-2005 vision,math,NJU. File Name: guess_card ...

  3. 关于C++中字符的转换

    VS的工程属性中我们常会设置Character Set:

  4. 用Py2exe打包Python脚本简单介绍

    一.简述      Py2exe,从这个名字上就可以理解,把Python脚本转换为windows平台上面可以运行的可执行程序(*.exe)的工具.经过转换后,你可以不 用安装Python的执行环境就可 ...

  5. leetcode383

    已知两个字符串,然后比较一个字符串是否来自另一个字符串,没有顺序要求. 简单题,用一个数组保存前一个字符串的每一个字符出现的次数,然后循环后一个字符串去检查,如果次数不够了,那么就返回false pu ...

  6. Web开发人员不要错过的60款用户界面设计工具(中)

    21. Dojo Dojo是一个用javascript语言实现的开源DHTML UI工具包,可实现高性能的桌面和移动应用程序开发,在国内亦有大量忠实用户. 22. Fivesecondtest Fiv ...

  7. HTML5的自定义属性data-*详细介绍和JS操作实例

    当然高级浏览器下可通过脚本进行定义和数据存取.在项目实践中非常有用. 例如: 复制代码 代码如下: <div id = "user" data-uid = "123 ...

  8. VS2012+EF6+Mysq

    为了学习ORM,选择了EntityFramework,经历了三天两夜的煎熬,N多次错误,在群里高手的帮助下,终于成功,现在将我的心路历程记录下来,一是让自己有个记录,另外就是让其它人少走些弯路. 我的 ...

  9. reflow和repaint

    Web页面运行在各种各样的浏览器当中,浏览器载入.渲染页面的速度直接影响着用户体验 简单地说,页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程.先来大致了解一下浏览器都 ...

  10. KVM 基本硬件容量扩容

    在工作当中如果虚拟机的容量不够使用 如何添加呢? CPU添加 cpu添加有两种方式: 1 创建虚拟机的时候可以添加 # virt-install --help | grep cpu --vcpus=V ...