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的原型;

原文地址:https://www.cnblogs.com/ZXH-null/p/12247615.html

时间: 2024-10-14 18:46:22

js继承模式、命名空间、对象枚举的相关文章

js继承模式

组合继承是js常用的继承模式,指的是将原型链和借用构造函数的技术结合在一起.其中的思想是使用原型链实现原型属性和方法的继承, 而通过借用构造函数实现对属性的继承. 例子: <script> function SuperType(name){ this.name = name; this.colors = ["red","blue"]; } SuperType.prototype.sayName = function(){ alert(this.name)

命名空间 对象枚举

//命名空间 //利用闭包防止变量污染 1 var name = 'bcd'; 2 var init = (function () { 3 var name = 'abc'; 4 function callName() { 5 console.log(name) 6 } 7 return function () { 8 callName(); 9 } 10 }()); 11 init(); 12 var li = { 13 wife1 : {name:"l"}, 14 wife2 :

JS创建对象模式及其对象原型链探究(五):组合使用构造函数模式和原型模式

组合使用构造函数模式和原型模式 构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性. 创建自定义类型的最常见方式,就是组合使用构造函数模式和原型模式. 1.创建对象 // 组合使用构造函数模式和原型模式 function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.friend = ["Jenny", "Court"]; } Person.p

js继承之三(对象关联方式,Object.create())

看惯了繁琐的prototype?其实有一种较为简洁的创建继承的方式——原型式继承 function object(o){ function F(){} F.prototype = o; return new F(); } 上面这段代码就是这个机制的核心了,严格来说他实现的是对象关联,要求有一个对象为基础(这句话 听起来怎们这么别扭 咳咳) 官方优化了这个操作提出了Object.create()详细的用法请百度.. 我的实现: b和a已经关联起来了,大家都是Object皆大欢喜,都是儿子: 当然b

继承模式,命名空间,对象枚举

(一) 继承模式 传统形式(原型链) (1) 缺点:过多的继承了没用的属性 (2) 代码展示 //缺点:过多的继承了没用的属性 Grand.prototype.lastName = '张'; function Grand(){ this.name = '国庆'; } var grand = new Grand(); Father.prototype = grand; function Father(){ this.name = '改革'; } var father = new Father();

js模块,类,继承,命名空间,私有属性等相关概念梳理

js确切的说是一种基于对象的语言,和纯面向对象的语言(比如as)稍微有点区别,js中没有类的概念.虽然有继承但是基于原型的继承.随着前段越来越受重视,jser们利用js的一些特性他们制造出了和纯面向对象一样好玩的东西.下面就js中一些概念进行概述,很多东西都是来自博客园的一些大牛,我写这篇文章主要想拿as和js做对比来讲,以方便as像转js的程序员们.本片文章涉及的概念有,模块,类,继承,私有属性和公开属性. 1.模块大家写as的时候都知道,as里面是有类的概念,每次生成一个类,系统中都会多一个

3. 闭包_对象组合继承模式_事件轮询机制

1.谈谈闭包? (产生条件.是什么.在哪里.作用.生命周期.缺点) 产生闭包的三个条件: 函数嵌套 内部函数引用外部函数的局部变量 执行外部函数 包含被引用的局部变量的一个"对象",  通过 chrome 开发者工具可以调试查看到,就是 closure,它存在嵌套的内部函数中 作用: 延长了局部变量的存活时间, 让函数外部可以操作(读写)到函数内部的数据(变量/函数) 闭包的生命周期: 产生 :  在嵌套内部函数定义执行完时就产生了(不是在调用) 死亡 :  在嵌套的内部函数成为垃圾对

面向对象为什么要多用对象模式而少用继承模式?

进来学习java的时候遇到了一些经验说多用对象模式,少用继承模式.现在写一点感想. 面向对象的对象之间的哦和方式有继承,实现,关联,依赖,聚合和组合.其中的继承和实现是继承这类模式. 说道的一个原因就是代码污染.例如一个父类非常复杂.而一个继承了这个类的子类可能重写了一部分的方法.但是继承了全部的方法.用户在使用继承的子类的时候可能会调用没有重写的父类的方法并且如果这种方法是在子类的设计者的意图之外的操作,那么子类在继承父类的时候,可以认为不光是继承到了有用的功能,还继承到了垃圾功能,父类的代码

JS继承六大模式

1.原型链 function SuperType(){this.property = true;} SuperType.prototype.getSuperValue = function(){return this.property;};function SubType(){this.subproperty = false;}//继承了SuperTypeSubType.prototype = new SuperType();SubType.prototype.getSubValue = fun