javascript之定义函数时 this 和prototype区别
注:原文 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区别的更多相关文章
- JavaScript 中定义变量时有无var声明的区别
关于JavaScript中定义变量时有无var声明的区别 var a=5; //正确 a=5; //正确 在javascript中,以上两种方法都是定义变量的正确方法.微软的Script56.CHM中 ...
- javascript使用parseInt函数时需要注意的一些问题
这个问题大家可能会忽视,我在项目中就遇到了.写了提醒一下大家!!! 在用javascript的parseInt函数时,parseInt("08")或者parseInt(" ...
- python定义函数时的默认返回值
python定义函数时,一般都会有指定返回值,如果没有显式指定返回值,那么python就会默认返回值为None, 即隐式返回语句: return None 执行如下代码 def now(): prin ...
- python定义函数时默认参数注意事项
如果在调用一个函数时,没有传递默认参数,则函数内的默认参数是对函数的默认参数属性__defaults__的引用, 如 def func(arg1=[]): arg1.append(2) 调用func时 ...
- python定义函数时的参数&调用函数时的传参
一.定义函数: 1.位置参数:直接定义参数 2.默认参数(或者关键字参数):参数名 = "默认值" 3.位置参数必须在默认参数之前 二.调用函数: 1.按位置传,直接写参数的值 2 ...
- 简要描述 JavaScript 中定义函数的几种方式
JavaScript 中,有三种定义函数的方式: 1.函数语句:即使用 function 关键字显式定义函数.如: function f(x){ return x+1; } 2.函数定义表达式:也称 ...
- Python中定义函数时参数有默认值的小陷阱
在定义函数的时候,如果函数的参数有默认值,有两种类型的参数,一种是整数,字符串这种不可变类型,另一种是列表这种可变类型,对于第一种情况没有什么特殊的地方,但是对于可变类型,有一个微妙的小陷阱. 可变类 ...
- [译]javascript中定义函数的各种方法
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- JavaScript中定义函数的几种方式
函数的组成:函数名 + 函数体 1.使用function关键字定义函数 -- 具有优先级,优先将function关键字定义的函数优先执行 function functionName(arg0, ar ...
随机推荐
- 协同过滤(CF)算法
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...
- drawableLayout的使用(转载讲的比较清晰的文章)
创建drawbler的布局文件 初始化drawbler的列表 响应drawable列表点击事件 现在侧滑菜单使用很多,大都是通过SlidingMenu实现.现在也可以通过DrawerLayout 创建 ...
- python 字典排序,列表排序详细
在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序.Python中字典的排序分为按“键”排序和按“值”排序. 1.按“值 ...
- String与string的区别
在C#中,string 是 System.String 的别名,所以基本上在使用时是没有差别的. 习惯上,我们把字符串当作对象时(有值的对象实体),我们用string.而我们把它当类时(需要字符串类中 ...
- js 放大镜用法bug解决
<img id="zoom_02" src='img/zhang5.jpg' data-zoom-image="img/zhang5p.jpg" /> ...
- Linux入门(一)常见虚拟机及Linux系统安装、xshell连接虚拟机
1环境 linux常用两种虚拟机 1.1 oracle VM VirtualBox 官方网站:https://www.virtualbox.org/ 1.2 vmware 下载链接:https: ...
- Eclipse 安装 HDFS 插件
Eclipse 安装 hdfs 连接插件 1.插件安装 在$HADOOP_HOME/contrib/eclipse-plugin/文件夹中有个hadoop-eclipse-plugin-0.20.20 ...
- Android Studio 如何将包名按层级展示
在project视图右上角有个“设置”的按钮,点开,然后将上图所圈部分去勾选就可以了.
- maven 国内镜像地址
由于连接国外网站时网速特慢,为解决这个问题,os china 建立了一个maven 的私服.为了记忆,特将此记录. settings.xml 设置镜像方法步骤如下: 1. mirrors 设置 < ...
- 收缩sql server数据库日志
项目中,可能数据库(sql server数据库)日志太多,占了很多磁盘空间,可以通过收缩数据库日志,减少日志文件大小. 下面以Northwind数据库为例: 1.把数据库的恢复模式设置为“简单模式”: ...