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=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定义在构造函数内部,也就可访问了。但作为实例函数,如果定义在构造函数内部,每次实例化都要执行,显然在浪费内存,也不合理。

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

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

结论:

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

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

时间: 2024-10-08 20:50:46

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

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

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中有一个关键字const,但目前的浏览器似乎还不支持,如果一定要定义一些常量,其实可以使用闭包,匿名函数实现常量的定义. 例如: var Class = (function() { var UPPER_BOUND = 100;//定义了常量 var Test={}; // 定义了一个静态方法 获取常量的方法 Test.getUPPER_BOUND=function() { return UPPER_BOUND; } return Test; })(); 用法: var k=Class.get

js面向对象编程:怎样定义常量?

js中有一个keywordconst,但眼下的浏览器似乎还不支持,假设一定要定义一些常量,事实上能够使用闭包,匿名函数实现常量的定义. 比如: var Class = (function() { var UPPER_BOUND = 100;//定义了常量 var Test={}; // 定义了一个静态方法 获取常量的方法 Test.getUPPER_BOUND=function() { return UPPER_BOUND; } return Test; })(); 使用方法: var k=Cl

JS面向对象编程创建类的方式

js创建类的方式有几种,大致如下: 1,构造函数方式: function Car(parameters) { this.name = "objectboy"; } var cat1 = new Car(); console.log(cat1.name); 2,Object.create() var Cat = { name: "大毛", makeSound: function(){ alert("喵喵喵"); } }; var cat1 = Ob

js面向对象编程,如何定义属性字段?

http://www.zhuke.com/user/zkuser7615004?p6=123.baidu.com=&lvhttp://www.zhuke.com/user/zkuser36324368?p6=123.baidu.com=&lvhttp://www.zhuke.com/user/zkuser63904407?p6=123.baidu.com=&lvhttp://www.zhuke.com/user/zkuser6179493?p6=123.baidu.com=&

Python面向对象编程——一些类定义(杂)

一.abstractmethod 子类必须全部实现重写父类的abstractmethod方法 非abstractmethod方法可以不实现重写 带abstractmethod方法的类不能实例化 from abc import abstractmethod, ABCMeta 1 class BettingStrategy(metaclass=ABCMeta): 2 3 @abstractmethod 4 def bet(self): 5 print('0') 6 7 def record_win(

js面向对象编程/原型链/继承 —— javascript

目录 js面向对象编程 js原型链 共享方法 原型继承 js面向对象编程 js面向对象编程不同于 java 的类和对象 JavaScript 不区分类和实例的概念,而是通过原型(prototype)来实现面向对象编程. js声明的构造函数,类似于普通函数的声明,但又不同, 实例对象时,如果不写new,就是一个普通函数,它返回 undefined. 但是,如果写了new,它就变成了一个构造函数,它绑定的 this 指向新创建的对象, 并默认返回 this,也就是说,不需要在最后写return th

由几道JS笔试题引发的知识点探究十五——JS面向对象编程

JS初学者大都没有认识到其强大的面向对象编程的特性,只是把JS当作一门简单实用的脚本语言来用.也正因如此,JS程序员往往处于程序员鄙视链的最低端,很多人觉得JS是HTML一类的语言,甚至连语言都称不上.事实完全不是如此,你若也有这种想法,说明你对JS的认识太浅薄了.要想正真迈入JS的大门,你必须深入了解JS面向对象编程的特性.下面就让我为大家一一道来. 一.创建对象 既然是面向对象,那肯定先得有对象吧,要有对象,肯定得知道对象是什么吧,那JS中的对象是什么呢?在C++里我们知道,对象就是类或结构