自定义对象(6种)

前言

  JavaScript:是一门\color{blue}{面向对象语言};而面向对象是一种\color{blue}{编程思想}\color{blue}{面向过程}是根据需求来一步一步完成任务的一种思想。

什么是对象?
  --- 指的是 属性方法 的集合体。

  • 属性:储存数据;
  • 方法:执行的动作。

什么是键值对?

 语法: obj = {
            name:12,
            age:13,
            skill:function(){}
        }

* name,age: 表示对象obj的属性名,冒号后面的为属性值,像这种形式我们叫 ***键值对*** 。
* skill: 是obj对象的方法。

自定义对象(5种):

1、字面量:

  • 优点:简单,容易理解
  • 缺点:不能批量生产

语法:

//1.字面量定义对象:
var obj = {
    name:"超人",
    age:27,
    skill:function(){
        console.log("激光波");
    }
}
console.log(obj.name);//超人 --- 调用 (属性)的语法
console.log(obj["name"]);//超人 --- 另一种调用 (属性)的语法,注意语法要加上双引号!
obj.skill();//激光波 --- 调用 (方法)的语法

2、工厂模式:

  • 优点:实现了对象的批量生产
  • 缺点:不能检测出对象是由谁来产生的。

语法:

//2.工厂模式:
function factory(name,age,callback){
    return {
        name:name,
        age:age,
        skill:function(){
          console.log("睡觉zZ")
        },
        callback:callback
    }
}

var girlfriend = factory("翠花",18);
console.log(girlfriend);//{name: "翠花", age: 18, skill: ƒ, callback: undefined}
var girlfriend2 = factory("如花",81);
console.log(girlfriend2);//{name: "如花", age: 81, skill: ƒ, callback: undefined}
console.log(girlfriend == girlfriend2);//false  //---因为是两个是独立的对象

//测试增加回调函数          
var girlfriend3 = factory("凤姐",20,function(){
    console.log("蛋炒饭!");
})
console.log(girlfriend3);//{name: "凤姐", age: 20, skill: ƒ, callback: ƒ}
girlfriend3.callback(); //调用里面的函数

//缺点:
console.log(girlfriend3 instanceof Object);//true   //--- 可是不能检测出对象是由谁来产生的
console.log(girlfriend3.prototype);//undefined   //---prototype只能用于函数,而这是对象

3、构造函数模式:
   --- 所有属性和方法需要通过this来定义,通过new关键词进行调用。

  • 优点:解决不能识别 其是由谁创建出来的问题。

  • 缺点:实现相同的方法,但是却会各自创建新的空间来存放这些方法。这样会造成空间浪费!

        拓展 : new关键词做了什么事?
           *      1、创建一个新对象
           *      2、将this指向新对象
           *      3、执行构造函数的代码
           *      4、返回这个 *新对象* 
    

语法:

//3.构造函数:
function Human(type,name,gender,age){
    this.type = type;
    this.name = name;
    this.gender = gender;
    this.age = age;
    this.skill = function(){
        console.log("走");
    }
}

var pangu = new Human("黄种人","盘古","男","20");
console.log(pangu);//Human {type: "黄种人", name: "盘古", gender: "男", age: "20", skill: ƒ}
var xiawa = new Human("白种人","夏娃","女","1000");
console.log(xiawa);//Human {type: "白种人", name: "夏娃", gender: "女", age: "1000", skill: ƒ}
                
console.log(xiawa.prototype);//undefined   //---prototype 对 对象不可用
console.log(xiawa.constructor);//Human(type,name,gender,age){..
console.log(xiawa.__proto__);//{constructor: ƒ}

//缺点:
console.log(pangu.skill == xiawa.skill);//false  
//--- 说明两个对象不是指向同一个空间,而是各创建一次对象,也就创建了一次相同的方法,这样会造成了资源空间浪费!

4、原型模式:

  • 优点:实现继承,解决了构造函数空间浪费问题
  • 缺点:不能定制

语法:

//4、原型模式:--- 用于解决继承问题
function Animal(){};
Animal.prototype.type = "猫";
Animal.prototype.skill = function(){
    console.log("吃吃吃--")
}//固定写一个属性,不可定制!

var mao = new Animal();
mao.skill();//吃吃吃--
var mao2 = new Animal();
console.log(mao.skill == mao2.skill);//true  //---说明两个对象指向同一个空间,是继承过来的。
console.log(mao)//Animal {}   //--- 说明mao自身没有skill方法
console.log(mao.__proto__)//{type: "猫", skill: ƒ, constructor: ƒ}  //---
            
console.log(mao == mao2);//false  //--- 说明每次new出来的都是独立的新对象
console.log(mao.type == mao2.type);//true  //---说明对象属性指向相同

5、混合模式:
   --- 构造函数模式和原型模式的结合。

  • 优点:
  • 缺点:

语法:

//5、混合模式:
function Student(cls,name,age,gender,number){
    this.cls = cls;
    this.name = name;
    this.age = age;
    this.gender = gender;
    this.number = number;
}
Student.prototype.skill = function(){
    console.log("学习");
}

var student1 = new Student("01","小芳",12,"女","0101");
console.log(student1);//Student {cls: "01", name: "小芳", age: 12, gender: "女", number: "0101"}  //--- 这里没有skill
var student2 = new Student("01","小蓝",12,"女","0101");
console.log(student2);//Student {cls: "01", name: "小芳", age: 12, gender: "女", number: "0101"}  //--- 这里没有skill
            
console.log(student1 == student2)//false   //---说明都是独立的个体
console.log(student1.skill == student2.skill)//true  //---说明都是继承父级的方法
            
/*注意*/
console.log(student1.age == student2.age)//true  //---这里返回的是简单数据类型,直接比较值

6、class类定义对象:
6.1、语法:
  class name{
    constructor( ){
      相当于混合模式的构造函数
    }
    放在constructor外面的方法或者是属性(这个位置的代码相当于混合模式中的原型对象上的方法)
  }
6.2、如何实现类与类之间的继承?
  --- 可以通过extends关键字来实现:
语法(比如类B需要继承类A):
  class A{ };
  class B extends A{
    constructor( ){
      super( )//调用类A
    }
  };

语法:

//6、class类实现选项卡:
class Tab{
constructor(){}//没有的话可以省略 ***
    init(){
        var leng = this.btns.length;
        var that = this;
        for(var i=0;i<leng;i++){
            this.btns[i].index = i;
            this.btns[i].addEventListener("click",function(){
                for(var j=0;j<leng;j++){
                    that.content[j].style.display = "none";
                }
                that.content[this.index].style.display = "block";
            })
        }
    }
}
            
class Tabchild extends Tab{
    constructor(el){
        super();//调用
        this.el = document.querySelector(el);//获取到选项卡最大的容器
        this.btns = this.el.querySelector(".btns").children;//获取所有按钮
        this.content = this.el.querySelector(".content").children;//获取内容    
    }
}
             
var tab = new Tabchild(".tab");
tab.init();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 2,098评论 0 6
  • 什么是对象? 对象(object)是数据的无序集合,其中数据包括基本类型、函数其他对象。对象的功能是它们将特定任务...
    江疏影子阅读 827评论 0 0
  • 面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。ECMAScr...
    DHFE阅读 965评论 0 4
  • 大街上华灯初升,银黄色星星灯像极了欢呼着点点星群,它们悬挂在金属支杆上,沿着大树从树干爬到树顶分散在枝桠处,若一...
    微冥皇阅读 322评论 1 3
  • 对一个人的好感最多存在4个月,一旦超过了,那可能就是爱了,真正的爱情,并不是一时好感,而是我知道遇到你不容易...
    安诺1阅读 383评论 0 1