zoukankan      html  css  js  c++  java
  • javascript学习(5)——[基础回顾]类_2_类的原型模式

    javascript类的原型模式,我想在这里简单的说一下,javascript本身不像java一样有着严格的继承,我们说javascript的继承,也是我们仿面向对象语言仿出来的,所以javascript虽然支持面向对象的编程,但是我们并不认为javascript是一种很好的面向对象的编程语言。

    那么javascript的面向对象是如何实现的呢?

    首先先简单说下prototype是每个类可以直接调用的,这个就可以说成是javascript的类的原型,当然这牵扯到原型链这种设计模式,当然我们以后会介绍到;

    而__proto__是每个对象可以直接调用的原型。

    那么我们取到原型有什么样的好处吗?

    其实好处就是我们可以实现继承,另一种意思就是说,我们可以通过将这个类的原型指向某个对象,或者某个对象的原型,从理解层面上来说,我们可以理解为,将这个对象的引用指向了我们=右边的对象,所以这样的话,就比较好理解了,待会结合代码会有一些图供大家理解,如果不理解,可以留言讨论。

    代码和注释如下:

    /**
     * javascript原型模式(prototype)
     * 1.原型是一个对象,其他的对象可以通过他实现属性的继承
     * 所有的对象在默认的情况下都有一个原型,因为原型本身也是对象所以一个类的真正
     * 原型是被类的内部的[Prototype]属性所持有.
     * 2.什么可以称之为对象
     * 在javascript一个对象就是任何的无序的键值对的集合 function | var a = {}
     * 如果它不是一个主数据类型(undefined,null,boolean,number,String)
     * 其他的通通叫做对象
     */
    (function(){
    	/**
    	 * javascript中的原型(prototype)是和函数(function紧密连接的)
    	 * var o = {} 他不是用function 他有原型吗?
    	 * 答:
    	 * 必须的
    	 * 每一个通过new操作符生成出来的对象都持有一个属性__proto__,
    	 * 这个属性保存了创建他的构造函数的prototype的原型的引用
    	 */
    	function person(){}//定义一个空对象
    	person.prototype.name = "USPCAT.COM";
    	person.prototype.showName = function(){
    		//这个this表示调用本函数的一个具体实例化的类
    		alert(this.name);
    	}
    	new person().showName();
    	
    	var cat = {};//cat空类
    	//默认隐藏的调用下面的代码
    	Object.getPrototypeOf(cat).name = "MAOMI";//通过getPrototypeOf这个函数可以直接得到对象的上一级原型链
    	cat.__proto__.master = "USPCAT.COM";
    	//测试、//隐式调用上边的方法
    	cat.age = 2;
    	cat["sex"] = "MAN";
    	alert(cat.name +"  "+cat.age+" "+cat["sex"]+" "+cat.master)
    	
    	/**
    	 * 利用原型模式实现见的继承
    	 * 
    	 */
    	function per(){
    		this.getName = function(str){
    			alert(str)
    		}
    	}
    	per.prototype.getAge = function(age){
    		alert(age)
    	}
    	var a = {};//空类    a是对象
    	a.__proto__ = per.prototype;
    	a.getAge(2);
    	//a.getName("YUNFENGCHENG")
    	
    	
    	/**
    	 * 简单方式实现继承
    	 * JS中是无法是实现多继承
    	 */
    	var b = {};
    	b.__proto__ = new per();
    	//改变constructor函数
    	b.__proto__.constructor = b;
    	b.getAge(1)
    	b.getName("JAVASCRIPT")
    //	class a{
    //	}
    //	class B extend A{
    //		public B(){
    //			super()
    //		}
    //	}
    	/**
    	 * 串连继承
    	 */
    	function m(){
    		this.showM = function(){
    			alert("IM IS M")
    		}
    	}
    	function n(){
    		this.showN = function(){
    			alert("IM IS n")
    		}
    	}	
    	function k(){};
    	n.prototype = new m();
    	n.prototype.constructor = n;
    	
    	k.prototype = new n();
    	k.prototype.constructor = k;
    	
    	var boo = new k();
    	boo.showM();
    	boo.showN();
    })()
    


    这张图,就是说明了我们可以类似理解为继承的时候引用的指向问题


    这张图也是


    这张图就是说明了串联继承

  • 相关阅读:
    Maven配置阿里云镜像
    docker启动报错 error creating overlay mount
    docker 运行jenkins容器
    centos7 安装docker
    Create PropertyManager Page Example (VB.NET)
    Solidworks api帮助代码报错 “特性说明符不是一个完整的语句。请使用行继续符将该特性应用于下列语句。“的解决办法!
    Solidworks API中在一个拉伸的矩形的前后面建立两个基准面的代码示例
    用vb.net运行一个应用程序,以solidworks为例
    solidworks二次开发中直接录出来的VB代码拿到自己建的项目里出现“未设置对象变量或with块变量”解决办法!
    visual studio xamarin 离线安装文件以及 android 模拟器
  • 原文地址:https://www.cnblogs.com/sunyingyuan/p/3686227.html
Copyright © 2011-2022 走看看