• 09 js自定义类与prototype关键字


    js自定义类的理解

    js自定义类,形式与功能上看起来就像java的类整体与类的构造方法的二合一。

    在实例与类的关系上,又有点像java中子类与父类的关系,因为js的实例可以给自己添加自己的方法和属性。

    js自定义类的声明

    声明方式也用关键字function,类名第一个字母大写,可以有参数(形如构造方法)。

    通过this定义每个类的实例拥有的变量和函数

    function Person(name,age){
    				this.name = name;
    				this.age = age;
    				this.fav = "唱歌";
    				//自定义类方法
    				this.test = new Function("alert('这是Person的函数test')");
    				
    			}
    

      

    类的实例(对象)

    如下:

    var p1 = new Person("小明",19);
    			var p2 = new Person("小红",20);
    			document.write(p1.name+"<br/>");
    			document.write(p1.age+"<br/>");
    			document.write(p1.fav+"<br/>");
    			document.write(p1.test()+"<br/>");
    			document.write(p2.name+"<br/>");
    			document.write(p2.age+"<br/>");
    			document.write(p2.fav+"<br/>");
    			document.write(p2.test()+"<br/>");
    

      运行结果:

    小明

    19

    唱歌

    undefined

    小红

    20

    唱歌

    undefined

    创建的对象可以自行添加自己的方法和属性,其它对象无法访问这些属性和方法。

    //添加实例的自定义方法和属性
    			p1.run = function(){
    				document.write("我在跑<br/>");
    			}
    			p1.run();
    			// p2.run();无法执行,因为run函数时p1自定义的
    

      

    prototype关键字

    prototype翻译为“原型”,我们通常说“原型空间”。

    在js中,每一个对象(函数,类,实例)都有自己的prototype空间,它可以被自己的实例访问,例如类的prototype空间,可以被它的每个实例访问(有一点类似ava中的静态变量),也可以自己访问。

    注意:

    • 自己访问自己的prototype空间需要加关键字prototype,如Person类访问自己原型空间的变量number:Person.prototype.number,如果不加prototype访问的就是普通的类变量number了
    • 实例可以直接使用 实例名.原型空间中的变量名 的方式访问原型空间中的变量,如Person类的一个实例p1访问Person类中的number变量可以直接书写为:p1.number,值得注意的是,如果Person类中使用this定义了一个同名的非prototype修饰的变量,则p1.number访问的时普通的number而不是原型空间的number
    • 同样的实例也有自己的方法,身为一个Person类的实例p1也可以给自己的原型空间中添加变量和方法:p1.prototype.color = "red";

    测试代码:

    <script type="text/javascript">
    			//自定义类
    			function Person(name,age){
    				this.name = name;
    				this.age = age;
    				this.number = 10;
    				Person.prototype.number = 9;
    				// this.fav = "唱歌";
    				// //自定义类方法
    				// this.test = new Function("alert('这是Person的函数test')");
    				this.doSubstract = function(str){
    					document.write(str+"对Person的原型空间的number做了-1操作!")
    					Person.prototype.number--;
    					document.write("<br />");
    				}
    				Person.prototype.cry = function(){
    					document.write("55555555555");
    				}
    			}
    			var p1 = new Person("小明",19);
    			var p2 = new Person("小红",20);
    			document.write(p1.name+"<br/>");
    			document.write(p1.age+"<br/>");
    			//p1访问Person的prototype原型空间的变量number
    			document.write("p1访问了Person的原型空间的number变量:"+p1.number+"<br/>");
    			p1.doSubstract("p1");
    			//p2也可以访问Person的prototype原型空间的变量number
    			document.write("p2访问了Person的原型空间的number变量:"+p2.number+"<br/>");
    			//也可以访问用Person直接访问自己的prototype原型空间的变量number
    			//但要加prototype关键字
    			document.write("通过类(此Person类)直接访问自己原型空间的number变量:"+Person.prototype.number+"<br/>");
    			p1.cry();
    			document.write("<br/>")
    			Person.prototype.cry();
    		
    			</script>
    

      

    运行结果:

    小明
    19
    p1访问了Person的原型空间的number变量:10
    p1对Person的原型空间的number做了-1操作!
    p2访问了Person的原型空间的number变量:10
    通过类(此Person类)直接访问自己原型空间的number变量:8
    55555555555
    55555555555

  • 相关阅读:
    Call指令和Ret指令讲解06 零基础入门学习汇编语言53
    【CSDN2012年度博客之星】喜欢本博客的读者,投票赠送《visual C++2010开发权威指南》电子稿感谢支持 ~(截至到2012年12月30日)
    本人新书< Visual C#2010开发权威指南>出版感谢大家一如既往的支持感谢CSDN总裁蒋涛以及他率领的CSDN团队提供的支持!
    在Windows Azure虚拟机上的SQL Server新教程
    Windows Azure Active Directory处理2000 亿个身份验证连接全球的人、 数据和设备
    宣布降低Windows Azure Storage的定价
    本人新书< Windows CE 7开发实战详解>出版感谢大家一如既往的支持感谢CSDN总裁蒋涛以及他率领的CSDN团队提供的支持!
    基于VC++2012图形化解决皇后问题
    3个 Windows Azure SQL Reporting开发的最佳做法
    现实世界的 Windows Azure: IT 公司提高其旗舰产品,为更多客户提供云解决方案
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/12207360.html
Copyright © 2020-2023  润新知