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>

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

  1. JS基础入门篇(十八)—日期对象

    1.日期对象 日期对象: 通过new Date()就能创建一个日期对象,这个对象中有当前系统时间的所有详细信息. 以下代码可以获取当前时间: <script> var t = new Da ...

  2. JS基础入门篇(十二)—JSON和Math

    1.JSON JSON: 对象格式的字符串 轻量的数据传输格式 注意事项: 键名 需要 使用 双引号 包起来 JOSN有两个方法:JSON.parse和 JSON.stringify. JSON.pa ...

  3. JS基础入门篇(十)— 数组方法

    1.join 作用: 将数组通过指定字符拼接成字符串.语法: string arr.join([separator = ',']);参数: separator可选,如果省略的话,默认为一个逗号.如果 ...

  4. JS基础入门篇(三十五)—面向对象(二)

    如果没有面向对象这种抽象概念的小伙伴,建议先看一下我写的JS基础入门篇(三十四)-面向对象(一)

  5. JS基础入门篇(二十七)—BOM

    虽然上次写到js基础篇(二十四),这次直接写到(二十七).是为了提醒自己中间有几篇没写.特此说明一下啊. 1.window.open() 使用a标签呢,点击一下a标签页面才会跳转,有时候我们需要做的操 ...

  6. Java开发学习(三十六)----SpringBoot三种配置文件解析

    一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...

  7. JS基础入门篇(三十四)— 面向对象(一)

    1.对象 对象的定义 : 对象 是 由 键值对 组成的无序集合. 创建对象两种方法 : 方法一 : 字面量方法 var obj = {name: "k"}; 方法二 : new O ...

  8. JS基础入门篇( 三 )—使用JS获取页面中某个元素的4种方法以及之间的差别( 一 )

    1.使用JS获取页面中某个元素的4种方法 1.通过id名获取元素 document.getElementById("id名"); 2.通过class名获取元素 document.g ...

  9. JS基础入门篇(六)— 数据类型

    1.数据类型 数据类型:我感觉就是对数据的种类进行分类.就好比把人分为儿童,青少年,中年,老年一样. 基础数据类型: Number(数字),String(字符串),Null(空),Undefined( ...

随机推荐

  1. signer information does not match signer information of other classes in the same package

    报错日志: java.lang.SecurityException: class "org.bouncycastle.asn1.ASN1ObjectIdentifier"'s si ...

  2. linux系统下jdk安装配置

    1.有jdk包(linux版) 2.放到linux系统下 3.建议在usr下新建jdk目录之后将jdk文件放到该目录下 3.配置系统信息   /etc/profile 需要配置的信息如下:#set j ...

  3. leetcode-解题记录 884. 两句话中的不常见单词

    题目 给定两个句子 A 和 B . (句子是一串由空格分隔的单词.每个单词仅由小写字母组成.) 如果一个单词在其中一个句子中只出现一次,在另一个句子中却没有出现,那么这个单词就是不常见的. 返回所有不 ...

  4. mac 上查看python3的各种安装路径

    1.mac chromedriver的安装目录:/usr/local/bin 2.mac htmltestrunner的存放目录:命令行下 import sys sys.path/Library/Fr ...

  5. VMWARE ESXI 虚拟硬盘的格式:精简置备、厚置备延迟置零、厚置备置零

    精简置备(thin): 精 简配置就是无论磁盘分配多大,实际占用存储大小是现在使用的大小,即用多少算多少.当客户机有输入输出的时候,VMkernel首先分配需要的空间并进行 清零操作,也就是说如果使用 ...

  6. 如何制作一个可以用Bochs调试的最新内核系统盘

    参考:http://blog.chinaunix.net/uid-26207112-id-3332621.html 1. 正确地创建一个包含启动分区的磁盘映像 1.1 创建磁盘映像文件 首先需要对磁盘 ...

  7. QTP Code Segment

    Dim WshShellset WshShell = CreateObject("WScript.Shell")WshShell.SendKeys "{DOWN}&quo ...

  8. 利用单臂路由实现VLAN间路由(有1个疑问)

    配置PC机: PC1:IP 192.168.1.1 :掩码:255.255.255.0:网关:192.168.1.254  VLAN 10 PC2:IP 192.168.2.1 :掩码:255.255 ...

  9. centos7下查看cup核数

    centos7下查看cup核数 # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数cat ...

  10. mysql数值字符串类型的按照数值进行排序

    今天遇到一个问题,就是对mysql数值字符串类型进行排序,在默认情况下使用order by 字段名称 desc/asc 进行排序的时候,mysql进行的排序规则是按照ASCII码进行排序的,并不会自动 ...