JS基础入门篇(三十六)—面向对象( 三 )

1.class

class es6 中 为 关键字用来声明 一个 类

1.只能通过new调用
2.不存在变量提升
3.多个方法之间直接书写,不需要,隔开
4.类的方法是直接定义在类的原型上的
5.定义在类中的方法不可枚举
6.Object.keys() 和 Object.values()

下面是详细解释

1.只能通过new调用

<script>

//--------------- class ------------------
  class Fn{}
//Fn();  //直接调用会报错
  var f=new Fn();//必须通过new调用
  console.log(f);//Fn?{}

//--------------- function ------------------
  function go() {}
  go();//函数可以直接调用
</script>

2.不存在变量提升

<script>
//---------------function解析时,会放到前面。所以不会报错-------------
go(); // 函数声明 可以 先调用 再声明
function go() {}// 函数声明

//---------------class解析时,不会放到前面。所以会报错-------------
var f=new Fn();//报错  Fn is not defined
class Fn{}
</script>

3.多个方法之间直接书写 不需要,隔开

<script>
 class Fn{
        constructor(name,age){
            this.name=name;
            this.age=age;
        }
        say(){
            console.log("我会说话");
        }
    }

    var f=new Fn("kite","18");
    console.log(f.name);//kite
    console.log(f.age);//18
</script>

解析:其中constructor方法和say方法之间并没有用逗给开。因为不是对象,所以不需要用逗号隔开。

4.类的方法是直接定义在类的原型上的

<script>
  class Fn{
        constructor(name,age){
            this.name=name;
            this.age=age;
        }
        say(){
            console.log("我是"+this.name);
        }
    }

    var f1=new Fn("kite","18");
    var f2=new Fn("Mary","28");
    f1.say();//我是kite
    f2.say();//我是Mary
    console.log(f1.say===f2.say);// true
    console.log(f1.hasOwnProperty("say"));//false 表示不是自身 身上的方法
</script>

5.定义在类中的方法不可枚举

class P {
        constructor(name,age){
            this.name = name;
            this.age = age;
        }
        say(){ // 这个say 是 挂在 P 类 的原型上的方法
            console.log("我会说话.我的名字叫:"+this.name);
        }
    };

    var p1 = new P("kite",29);
    for( var attr in p1 ){
        console.log( attr );
        //运行结果为
        //name
        //age
    }

6.Object.keys()和Object.values()
除了通过for in来遍历对象中的属性,可以通过Object.keys()得到对象的属性名,可以通过Object.keys()得到对象的属性值

<script>
class P {
        constructor(name,age){
            this.name = name;
            this.age = age;
        }
        say(){ // 这个say 是 挂在 P 类 的原型上的方法
            console.log("我会说话.我的名字叫:"+this.name);
        }
    };

    var p1 = new P("kite",29);

    console.log( Object.keys( p1 ) ); //["name", "age"]
    console.log( Object.values( p1 ) ); //["kite", 29]
</script>

2.继承-extends

继承
    extends
注意:
    构造函数中调用super 

举例说明

<script>
    //父类
    class Fn{
        constructor(name,age){
            this.name=name;
            this.age=age;
        }
        say(){
            console.log("我的名字是"+this.name);
        }

    }

    //子类
    class F extends Fn{
        constructor(name,age,job){
            super(name,age);
            this.job=job;
        }
        say(){
            console.log("我的名字是"+this.name,"我的工作是"+this.job);
        }
        eat(){
            console.log("我喜欢吃西瓜");
        }
    }

    //子类实例化
    var f=new F("zm",18,"worker");
    f.say();//我的名字是zm 我的工作是worker
    f.eat();//我喜欢吃西瓜

</script>

3.自定义属性

自定义事件
创建:new CustomEvent(事件名,事件对象设置参数);
事件对象设置参数 {bubbles:true}//是否设置冒泡
绑定:元素.addEventListener
触发:元素.dispatchEvent(自定义事件实例,事件名)

举例说明:

<body>
<div id="box">box</div>
<script>
    var box = document.getElementById("box");
    //创建自定义属性
    var c = new CustomEvent("abc", {bubbles: true});
    //自定义属性绑定
    box.addEventListener("abc", function () {
        console.log(1);
    });
    box.addEventListener("abc", function () {
        console.log(2);
    });
    //自定义属性触发
    box.dispatchEvent(c, "abc");
</script>
</body>

通过函数模拟自定义函数:

    <script>
        var obj={};

        //addFn函数作用:
        // 用空对象存储 事件名 和 函数
//         以以下这种方式存储
//        {
//            abc:[fn1,fn2];
//            cfd:[fb1,fb2];
//        }
        function addFn( EventName,fn ) {
            if(!obj[ EventName]){
                obj[ EventName]=[];
            }
            obj[ EventName].push(fn);
        }

        //trigger函数作用:
        //通过for循环触发函数
        function trigger(EventName) {
            for(var i=0;i<obj[ EventName].length;i++){
                obj[ EventName][i]();
            }
        }

        addFn("abc",function () {console.log(1);});
        addFn("abc",function () {console.log(2);});
        addFn("abc",function () {console.log(3);});

        trigger("abc");
</script>

以面向对象的方式 写 自定义事件:

<script>
        class CustomEv{
            constructor(){
                this.obj = {};
            }
            addFn( EventName,fn ) {
                if(!this.obj[ EventName]){
                    this.obj[ EventName]=[];
                }
                this.obj[ EventName].push(fn);
            }
            trigger(EventName) {
                for (var i = 0; i < this.obj[EventName].length; i++) {
                    this.obj[EventName][i]();
                }
            }
        }

        var c=new CustomEv();
        c.addFn("abc",function () {console.log(1);});
        c.addFn("abc",function () {console.log(2);});
        c.addFn("abc",function () {console.log(3);});

        c.trigger("abc");
</script>

原文地址:https://www.cnblogs.com/homehtml/p/11891357.html

时间: 2024-10-13 05:19:58

JS基础入门篇(三十六)—面向对象( 三 )的相关文章

【Android的从零单排开发日记】之入门篇(十六)——Android的动画效果

      什么是动画,动画的本质是通过连续不断地显示若干图像来产生“动”起来的效果.比如说一个移动的动画,就是在一定的时间段内,以恰当的速率(起码要12帧/秒以上,才会让人产生动起来的错觉)每隔若干时间在屏幕上更新一次位置.游戏中的动画效果也是由此而来.同样还有其他属性变更所引起的动画效果,从数学的角度来看,包括:(1)平移(2)旋转(3)缩放(4)透明度.当然这些属性可以组合起来使用,来达到更绚丽的画面.但是不论什么样的组合方式,我们都可以统一用Matirx运算来实现,从技术实现的角度来讲,

Egret入门学习日记 --- 第三十六篇(书中 10.7 ~ 10.8 节 内容)

第三十六篇(书中 10.7 ~ 10.8 节 内容) 开始 书中 10.7 节内容. 书中 10.7 节内容结束. 书中重点: 1.导出素材. 2.配置粒子库. 3.播放动画. 开始操作: 1.导出素材. 我设置好了雪花的效果. 接着是导出. 这是导出后的资源文件. 导入Egret的预加载资源组中. 2.配置粒子库. 下载好官方的粒子库. https://github.com/egret-labs/egret-game-library 拷贝粒子库到项目外,记住 项目文件夹外! 配置好 egret

【WPF学习】第三十六章 样式基础

原文:[WPF学习]第三十六章 样式基础 前面三章介绍了WPF资源系统,使用资源可在一个地方定义对象而在整个标记中重用他们.尽管可使用资源存储各种对象,但使用资源最常见的原因之一是通过他们的保存样式. 样式是可应用于元素的属性值集合.WPF样式系统与HTML标记中的层叠样式表(Cascading Style Sheet,CSS)标准担当类似的角色.与CSS类似,通过WPF样式可定义通用的格式化特性集合,并且为了保证一致性,在整个应用程序中应用他们.与CSS一样,WPF样式也能够自动工作,指定具体

Linux及Arm-Linux程序开发笔记(零基础入门篇)

Linux及Arm-Linux程序开发笔记(零基础入门篇)  作者:一点一滴的Beer http://beer.cnblogs.com/ 本文地址:http://www.cnblogs.com/beer/archive/2011/05/05/2037449.html 目录 一.Arm-Linux程序开发平台简要介绍... 3 1.1程序开发所需系统及开发语言... 3 1.2系统平台搭建方式... 4 二.Linux开发平台搭建... 5 2.1安装虚拟工作站... 5 2.2安装Linux虚拟

SQLAlchemy 教程 —— 基础入门篇

SQLAlchemy 教程 -- 基础入门篇 一.课程简介 1.1 实验内容 本课程带领大家使用 SQLAlchemy 连接 MySQL 数据库,创建一个博客应用所需要的数据表,并介绍了使用 SQLAlchemy 进行简单了 CURD 操作及使用 Faker 生成测试数据. 1.2课程知识点 学会用 SQLALchemy 连接数据库(MySQL, SQLite, PostgreSQL), 创建数据表: 掌握表数据之间一对一,一对多及多对多的关系并能转化为对应 SQLAlchemy 描述: 掌握使

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: ? ? ? ? ? ?将一些东西封装到一个地方,你还可以取出来 ? ? ? ? ? ?类设置静态属性, 设置一些方法 或者 对象, 对象可以在其对象封装一些属性 多态: ? ? ? ? ? ?python默认支持多态, 多态指的是一种事务具有多种形态 ? ? ? ? ? ?1.多态可以增加代码的灵活度: ? ? ? ? ? ?2.以继承和重写父类方法为前提: ?

微信小程序把玩(三十六)Storage API

原文:微信小程序把玩(三十六)Storage API 其实这个存储在新建Demo的时候就已经用到了就是存储就是那个logs日志,数据存储主要分为同步和异步 异步存储方法: 存数据 wx.setStorage(object) 相同key会覆盖,可写回调方法 获取方法: wx.getStorage(object) 清除方法: wx.clearStorage()里面可以写回调函数 成功,失败,完成 同步存储方法: 存数据 相同key会覆盖 wx.setStorageSync(key,data) 读数据

NeHe OpenGL教程 第三十六课:从渲染到纹理

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十六课:从渲染到纹理 放射模糊和渲染到纹理: 如何实现放射状的滤镜效果呢,看上去很难,其实很简单.把渲染得图像作为纹理提取出来,在利用OpenGL本身自带的纹理过滤,就能实现这种效果,不信,你试试. 嗨,我是Dario Corn

Gradle 1.12用户指南翻译——第三十六章. Sonar Runner 插件

本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个