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>
JS基础入门篇(三十六)—面向对象( 三 )的更多相关文章
- JS基础入门篇(十八)—日期对象
1.日期对象 日期对象: 通过new Date()就能创建一个日期对象,这个对象中有当前系统时间的所有详细信息. 以下代码可以获取当前时间: <script> var t = new Da ...
- JS基础入门篇(十二)—JSON和Math
1.JSON JSON: 对象格式的字符串 轻量的数据传输格式 注意事项: 键名 需要 使用 双引号 包起来 JOSN有两个方法:JSON.parse和 JSON.stringify. JSON.pa ...
- JS基础入门篇(十)— 数组方法
1.join 作用: 将数组通过指定字符拼接成字符串.语法: string arr.join([separator = ',']);参数: separator可选,如果省略的话,默认为一个逗号.如果 ...
- JS基础入门篇(三十五)—面向对象(二)
如果没有面向对象这种抽象概念的小伙伴,建议先看一下我写的JS基础入门篇(三十四)-面向对象(一)
- JS基础入门篇(二十七)—BOM
虽然上次写到js基础篇(二十四),这次直接写到(二十七).是为了提醒自己中间有几篇没写.特此说明一下啊. 1.window.open() 使用a标签呢,点击一下a标签页面才会跳转,有时候我们需要做的操 ...
- Java开发学习(三十六)----SpringBoot三种配置文件解析
一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...
- JS基础入门篇(三十四)— 面向对象(一)
1.对象 对象的定义 : 对象 是 由 键值对 组成的无序集合. 创建对象两种方法 : 方法一 : 字面量方法 var obj = {name: "k"}; 方法二 : new O ...
- JS基础入门篇( 三 )—使用JS获取页面中某个元素的4种方法以及之间的差别( 一 )
1.使用JS获取页面中某个元素的4种方法 1.通过id名获取元素 document.getElementById("id名"); 2.通过class名获取元素 document.g ...
- JS基础入门篇(六)— 数据类型
1.数据类型 数据类型:我感觉就是对数据的种类进行分类.就好比把人分为儿童,青少年,中年,老年一样. 基础数据类型: Number(数字),String(字符串),Null(空),Undefined( ...
随机推荐
- [CSP-S模拟测试]:gcd(莫比乌斯反演)
题目描述 有$n$个正整数$x_1\sim x_n$,初始时状态均为未选.有$m$个操作,每个操作给定一个编号$i$,将$x_i$的选取状态取反.每次操作后,你需要求出选取的数中有多少个互质的无序数对 ...
- oauth2学习
oauth2 生词: 授权码模式(authorization code) 简化模式(implicit) 密码模式(resource owner password credentials) 客户端模式( ...
- selenium2-java 浏览器不同窗口切换
1,获取浏览器的单个窗口: String parentWindowid = driver.getWindowHandle(); System.out.println( ...
- PHP将mysql数据表转换为excel文件
测试代码: <?php $DB_Server = "127.0.0.1"; $DB_Username = "root"; $DB_Password = & ...
- [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent c ...
- QT简介及下载
| 版权声明:本文为博主原创文章,未经博主允许不得转载. Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架.它既可以开发GUI程序,也可用于开发非GUI 程序,比如控制 ...
- 用其他音乐源帮帮网易云,Ubuntu听歌利器
镜像文章 1.用其他音乐源帮帮网易云,Android听歌利器 2.用其他音乐源帮帮网易云,Windows听歌利器 众所周知,国内只有网易云推出了Linux的客户端,在Listen 1并不十分好用的基础 ...
- 转 zookeeper,dubbo和Nginx的区别
Nginx是著名的反向代理服务器,也被广泛的作为负载均衡服务器 ZooKeeper是分布式协调服务框架,有时也被用来做负载均衡 那么他们的区别是什么?如何选择呢? 下面从实际场景看下他们的关系 Ngi ...
- python列表之添加、修改和删除元素
修改列表中的元素: subject= ['math', 'Chinese', 'English'] subject[0] = 'history' # 列表名[要修改元素的下标]=修改后的元素 prin ...
- Codeforces 492B Name That Tune ( 期望DP )
B. Name That Tune time limit per test 1 second memory limit per test 256 megabytes input standard in ...