zoukankan      html  css  js  c++  java
  • js继承模式、命名空间、对象枚举

    继承模式

    继承发展史

    1、传统形式--原型链

    • 过多的继承了没用的属性

    2、借用构造函数

    • 不能继承借用构造函数的原型
    • 每次构造函数要多走一个函数

    3、共享原型

    • 不能添加自己原型的自定义属性,会把共享原型的对象的原型的属性也更改。

    4、圣杯模式

      //1.原型链
      	Grand.prototype.lastName = "li";
        function Grand(){
        	
        }
        var grand = new Grand();
    
        Father.prototype = grand;
        function Father(){
        	this.name = "kkk";
        }
        var father = new Father();
        Son.prototype = father;
        function Son(){
    
        }
        var son = new Son();
    
       //2、借用构造函数
       function Person(name,age,sex){
       	this.name = name;
       	this.age = age;
       	this.sex= sex;
       }
       function Student(name,age,sex,grade){
       	Person.call(this,name,age,sex);
       	this.grade = grade;
       }
       var student = new Student();
    
       //3、共享原型
       Father.prototype.lastName = "chen";
       function Father(){
    
       }
    
       function Son(){
    
       }
    
       function inherit(target,origin){
       	target.prototype = origin.prototype;
       }
       inherit(Son,Father);
       var father = new Father();
       var son = new Son();
    
       //4、圣杯模式 !important
       Father.prototype.lastName = "chen";
       function Father(){
    
       }
    
       function Son(){
    
       }
       
       function inherit(target,origin){
    	function F(){};
    		//target.prototype = new F();//不能放在F.prototype = origin.prototype之前,因为这里用的是修改之前的F的原型,没有指向origin的原型。
    		F.prototype = origin.prototype;
       		target.prototype = new F();//target的原型是一个new的F对象,可以实现自定义的prototype的属性而不改变origin的原型。
    		target.prototype.constructor = target;
    		target.prototype.uber = Origin.prototype;//超类,知道它的原型真正继承自哪里。
       }
       inherit(Son,Father);
       var father = new Father();
       var son = new Son();
    

    命名空间

    //命名空间 -- 解决命名重复的问题
     	var grade = {
     		class1:{
     			zhangsan:{
    
     			},
     			lisi:{
    
     			}
     		},
     		class2:{
     			chen:{
    
     			},
     			ying:{
    
     			}
     		}
     	}
     	var chen = grade.class2.chen;
    

    现在解决命名重复的问题一般使用webpack打包工具

    对象属性和方法的调用

    1、连续调用

     	//连续调用
     	var methods = {
     		name:"chen",
     		age: 19,
     		gender:"female",
     		sayName:function (){
     			console.log(this.name);
     			return this;
     		},
     		sayAge:function(){
     			console.log(this.age);
     			return this;
    
     		},
     		sayGender:function(){
     			console.log(this.gender);
     			return this;
     		}
     	};
     	methods.sayName().sayGender().sayAge();//chen female 19
    	//函数最后返回的都是this对象,可以实现连续调用。
    
    

    2、通过属性名访问对象属性
    可实现通过参数调用想要的对象属性,从而减少代码量

    //通过属性名访问对象属性
     	var teachers = {
     		teacher1:"chen",
     		teacher2:"li",
     		teacher3:"he",
     		teacher4:"huang",
     		sayTeacher:function(index){
     			return this['teacher'+index];
     		}
     	};
     	teachers.sayTeacher(1);//chen
     	teachers.sayTeacher(2);//li
    

    对象的枚举

    for in循环
     //对象的枚举/遍历 enumeration
     //1.类比,数组的遍历
    	 var arr = [1,2,3,4,5];
    	 for (var i = 0;i < arr.length;i++){
    	 	console.log(i);
    	 }
    //2.对象属相的遍历
    	 var obj = {
    	 	name:'chen',
    	 	age:12,
    	 	gender:'female',
    	 	hight:174,
    		prop:"ffa"
    
    	 }
    	 for (var prop in obj){//prop也可以换成其他名字
    	 	console.log(obj[prop] + " "+ typeof(prop));
    	 }
    

    1.hasOwnProperty属性
    理论上,for in可以访问原型上的属性,所以加hasOwnProperty过滤

    for (var prop in obj){//prop也可以换成其他名字
    	 	if(obj.hasOwnProperty(prop)){//判断属性是都是属于这个对象自己的
    		 	console.log(obj[prop] + " "+ typeof(prop));
    		 }
    	 }
    

    2.in
    3.instanceof

      • A instance B;//A对象是不是B构造函数构造出来的;
      • 看A对象的原型链上有没有B的原型;
  • 相关阅读:
    Android SQLite 简单使用演示样例
    经常使用排序算法实现[交换排序之冒泡排序、高速排序]
    Spring In Action读书笔记
    Linux 经常使用快捷键
    Android组件系列----ContentProvider内容提供者【1】
    Android Stuido 好卡怎么办?不要急,兄弟来教你
    【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记3 Xcode、Auto Layout及MVC
    JAVA学习第四十五课 — 其它对象API(一)System、Runtime、Math类
    hdu 5073 Galaxy
    从设计稿到demo
  • 原文地址:https://www.cnblogs.com/1549983239yifeng/p/14431182.html
Copyright © 2011-2022 走看看