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定义的方法,而且应该定义在构造函数外部。

时间: 2024-11-05 12:20:33

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

js类定义函数时用不用prototype的区别?

一直在使用js编写自以为是面向对象的方法,遇到一个问题,就是定义一个方法,如下:      function ListCommon2(first,second,third) {   this.First=function () {  alert("first do"+first); } }  ListCommon2.do1=function(first) {    //   this.First();  alert("first do"+first); } List

js面向对象编程: js类定义函数时prototype和this区别?

在面向对象编写js脚本时,定义实例方法主要有两种 如下: function ListCommon2(afirst) { var first=afirst; this.do1=function () { alert("first do"+first); } } ListCommon2.prototype.do2=function() { // alert("first do"+first);//会出错,不能访问first this.do1(); } this.do1=

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

这个问题大家可能会忽视,我在项目中就遇到了.写了提醒一下大家!!! 在用javascript的parseInt函数时,parseInt("08")或者parseInt("09")返回的居然是0,而parseInt("01")...parseInt("07")都是正确的,一开始很难理解,后来发现出现这个问题的原因是当在前面有"0"时,javascript的debugger会认为这是一个八进制数,而"

js两种定义函数、继承方式及区别

一:js两种定义函数的方式及区别 1:函数声明: function sayA() { alert("i am A"); } 2:函数表达式: var sayB = function() { alert("i am B"); } 区别:code 前者会在代码执行之前提前加载到作用域中,后者则是在代码执行到那一行的时候才会有定义 二:js两种继承方式及区别 对象冒充 临时属性 call() apply() 原型链 code 继承应选哪种 code 三:实例 js两种定义

Python - 在定义函数时,为什么默认参数不能放在必选参数前面?

直接定义这样的函数时,Python会报错: Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:16:31) [MSC v.1600 64 bit (AMD64)] on win32 Type "copyright", "credits" or "license()" for more information. >>> def foo(p1, p2=6, p3): return 0

Python定义函数时,不同参数类型的传递

python的底层是通过C语言实现,因此参数调用时是通过地址传递的(和C语言一样,值是单向传递,指针才能实现双向传递),比如: # -*- coding: utf-8 -*-def f1(x,y): z=x+y y=x return z a= 1 b=2 c=f1(a, b) print c, a, b 得到的结果是 3 1 2 从这里可以看出b值并没有变化,也就是说值是单向传递的. 函数的定义时,参数可以是数值,列表(当元组处理),字典等,其参数定义形式如下: def f(a, *pargs,

js面向对象编程: js类定义函数时prototype和this差别?

在面向对象编写js脚本时,定义实例方法主要有两种 例如以下: function ListCommon2(afirst) { var first=afirst; this.do1=function () { alert("first do"+first); } } ListCommon2.prototype.do2=function() { // alert("first do"+first);//会出错.不能訪问first this.do1(); } this.do

JavaScript基础:定义函数时用var和不用var的区别

首先看两种函数声明: var square1 = function (x){ return x*x; } function square2(x){ return x*x; } 两者看似不同,在大多数使用的时候也并无太大区别,但是第一种使用时有时会报错,如: var r1=square1(x); var r2=square2(x); var square1 = function (x){ return x*x; } function square2(x){ return x*x; } javasc

python中定义函数时,self怎么理解:

在定义方法的时候有一个self参数,在所有的方法声明中都要用到这个参数,这个参数代表实例对象本身,当你用实例调用方法的时候, 由解释器自动的把实例对象本身悄悄的传递给方法,不需要你自己传递self进来,例如有一个带有两个参数的方法,你所有调用只需要传递进来二个参数. 例如这两个文件: 文件名: test.py class A: def  abc(self,a,b): a=a+1 b=b+1 文件名: test2.py import A A.abc(1,2) print a,b test2.py中