Es6对象的扩展和Class类的基础知识笔记
/*---------------------对象的扩展---------------------*/
//属性简写 ,属性名为变量名, 属性值为变量的值
export default function(){
const a='aaa';
const b={a};
console.info(b);//b==={a: "aaa"} function d(x,y){
//相当于 return {x:x,y:y} //属性的简写
return console.info({x,y})
}
d(1,2); //{x: 1, y: 2} const name='leyi',petName='jiucaiqiezi';
const e={
name,
petName, //属性简写 petName:petName
sayHello(){console.info({name,petName})} //函数简写
};
e.sayHello(); //{name: "leyi", petName: "jiucaiqiezi"}
} //属性名表达式
const f={};
f.name='leyi';
f['pet'+'name']='jiucaiqieizi';
console.info(f); //{name: "leyi", petName: "jiucaiqiezi"} const fname='name';
const g={
[fname]:'leyi',
['pet'+'name']:'jiucaiqieizi',
['say'+'Hello'](){
console.info(this.fname);
},
};
console.info(g);//{name: "leyi", petName: "jiucaiqiezi"}
g.sayHello();//表达式可以用于定义方法名 //属性名表达式如果是一个对象,默认情况下会自动将对象转为字符串[object Object]
const h={'name':'leyi'};
const i={
[h]:'jiucaiqiezi',
};
console.info(i); //{[object Object]: "jiucaiqiezi"} //Object.is 用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致
console.info(Object.is(+0,-0)); //false 不会转换数据类型 //Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target) 跟$.extend()差不多
//如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性 const j={"name":"hello"};
const k={"petName":"jiucaiqiezi",obj:{'color':'red'}};
//不是对象的参数会转成对象
const l=Object.assign({"name":"leyi"},j,k,undefined,null,'wo'); //undefined和null无法转成对象,非首参数就会跳过
console.info(l);
//Object.assign方法实行的是浅拷贝,而不是深拷贝。如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用
k.obj.color='green';
console.info(l);//{0: "w", 1: "o", name: "hello", petName: "jiucaiqiezi", obj: Object} obj{"color:green}
//Object.assign可以用来处理数组,但是会把数组视为对象。
console.info(Object.assign([1,2,3])); //{0:1,1:2,2:3}
console.info(Object.assign([1,2,3],[4,5,6])); //[4, 5, 6] //属性的遍历
//for...in循环遍历对象自身的和继承的可枚举属性
//Object.keys(obj) 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性 所以一般用Object.keys()代替for...in循环
const m={'name':'leyi',"petName":'jiucaiqiezi'};
console.info("Object.keys",Object.keys(m)); //["name", "petName"]
//Object.getOwnPropertyNames 返回一个数组,包含其自身的可枚举和不可枚举属性的名称
const n=[1,2,3,4,5];
console.info("Object.getOwnPropertyNames",Object.getOwnPropertyNames(n)); //["0", "1", "2", "3", "4", "length"] function OParent(){
this.pAttr=0;
}
function OChild(){
this.cttr1=1;
this.cttr2=2
}
OChild.prototype=new OParent();
//该方法不会获取到原型链上的属性
console.info(Object.getOwnPropertyNames(new OChild())); //["cttr1", "cttr2"] //Object.setPrototypeOf方法用来设置一个对象的prototype对象并返回该对象 prototype
const proto={'petName':'jiucaiqiezi'};
const obj={"name":'leyi'};
Object.setPrototypeOf(obj,proto);
console.info(obj.__proto__); //{petName: "jiucaiqiezi"}
//getPrototypeOf用于读取一个对象的原型对象
console.info(Object.getPrototypeOf(new OChild())); //{pAttr: 0} //Object.keys Object.values Object.entries
console.info(Object.keys(obj)); //["name"]
console.info(Object.values(obj));//["leyi"]
console.info(Object.entries(obj)); //[['name','leyi']]; //通过Object.entries将对象转为map结构
const p={'name':'leyi','petName':'jiucaiqiezi'};
const pMap=new Map(Object.entries(p));
console.info(pMap.size);
const q = { one: 1, two: 2 };
for (let [k, v] of new Map(Object.entries(q))) {
console.info(`${k}------${v}`);
} /*---------------------class基本语法---------------------*/
//定义类
//定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
class R{
constructor(ag1,ag2){
this.ag1=ag1;
this.ag2=ag2;
}
hello(){
return `
${this.ag1}
${this.ag2}
`
}
}
const s=new R(1,2);
console.info(s.hello()); //1 2 //类的所有方法都定义在类的prototype属性上面
class T{
tt(){}
ttt(){}
}
//上面等同于
T.prototype={
tt(){},
ttt(){},
}; //类的方法都定义在prototype对象上面,所以类的新方法可以添加在prototype对象上面。Object.assign方法可以很方便地一次向类添加多个方法
Object.assign(T.prototype,{
tttt(){},
ttttt(){},
});
console.info(Object.getPrototypeOf(new T()));//{tt: function, ttt: function, tttt: function, ttttt: function} //constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,
// 如果没有显式定义,一个空的constructor方法会被默认添加。
//constructor方法默认返回实例对象
//类的所有实例共享一个原型对象
//可以通过实例的__proto__属性为Class添加方法
new T().__proto__.tttttt=function(){};
console.info(Object.getPrototypeOf(new T()));//{tt: function, ttt: function, tttt: function, ttttt: function, tttttt: function} //class的继承
//Class之间可以通过extends关键字实现继承
class U extends R{
constructor(ag1,ag2,name){
super(ag1,ag2); //super关键字,它在这里表示父类的构造函数,用来新建父类的this对象
//this 指向当前类 super(ag1,ag2).call(this)
this.name='leyi';
}
hi(){
return this.name+'-----'+this.ag1+'-----'+this.ag2
}
}
const v=new U(1,2);
v.hi();
console.info(v,v instanceof U,v instanceof R);//{ag1: 1, ag2: 2, name: "leyi"} true true //super作为对象时,在普通方法中,指向父类的原型对象;在静态方法中,指向父类。
class S1{
constructor(){
}
static sayhi(){
console.info('sayhi');
}
sayhello(){
console.info('sayhello');
}
}
S1.attr1='attr1'; class S2 extends S1{
constructor(){
super();
}
static hi(){
super.sayhi();//super作为对象时,在静态方法中,指向父类
console.info( super.attr1);//attr1
}
hello(){
super.say1; //super作为对象时,在普通方法中,指向父类的原型对象
}
} new S2().hello();
S2.hi(); //Class作为构造函数的语法糖,同时有prototype属性和__proto__属性
//子类的__proto__属性,表示构造函数的继承,总是指向父类
//子类prototype属性的__proto__属性,表示方法的继承,总是指向父类的prototype属性。
class W{
}
class X extends W{
constructor(){
super();
}
}
console.info(X.__proto__==W,X.prototype.__proto__= W.prototype);// true true //Object.getPrototypeOf方法可以用来从子类上获取父类,也可以用来判断一个类是否继承了另一个类
console.info(Object.getPrototypeOf(X)===W);//true X.__proto__==W //类的静态方法
//该方法不会被实例继承,而是直接通过类来调用
class Y{
static method1(){
return 'hello static!'
}
}
console.info("Y.method1()------------->",Y.method1()); //父类的静态方法,可以被子类继承
class YY extends Y{
static method2(){
return super.method1(); //静态方法也是可以从super对象上调用
}
}
console.info("YY.method1()------------->",YY.method1());
console.info("YY.method2()------------->",YY.method2()); //ES6规定Class内部只有静态方法,没有静态属性
//class 的静态属性 静态属性指的是Class本身的属性 和实例属性
class Z{
//static attr0='attr0'; //Es7的提案 定义类的静态属性,目前不支持
//attr0='attr0'; //定义类的实例属性 不支持
constructor(){
this.attr0='attr0';
console.info(this.attr0);
}
}
Z.attr1='attr1'; //定义类的静态属性
console.info("new Z().attr0---->",new Z().attr0);//attr0 //new.atrget 属性 返回new命令作用于的那个构造函数。如果构造函数不是通过new命令调用的,new.target会返回undefined class AA{
constructor(){
console.info("new.target----->",new.target===AA); //new.target-----> true
}
}
new AA(); //子类继承父类时,new.target会返回子类
class AAA extends AA{
constructor(){
super(); //new.target-----> false
console.info("new.target----->",new.target===AAA);//new.target-----> true
}
}
new AAA(); //利用这个特点,可以写出不能独立使用、必须继承后才能使用的类
class BB{
constructor(){
if(new.target===BB){
throw new Error('此类不能被实例化!');
}
}
}
class BBB extends BB{
constructor(){
super();
this.name='leyi';
}
hello(){
console.info("this.name----->",this.name);
}
} new BB(); //此类不能被实例化!
new BBB().hello(); //this.name-----> leyi
Es6对象的扩展和Class类的基础知识笔记的更多相关文章
- es6对象的扩展
对象(object)是 JavaScript 最重要的数据结构之一. object 在es6中新增了很多便利的方法 在es6中允许直接写入变量和方法的名称直接作为对象的属性 let x =1 ,y=2 ...
- ES6对象的扩展及新增方法
1.属性的简洁表示法 ES6允许直接写入变量和函数,作为对象的属性和方法.这样的书写更加简洁. const foo = 'bar'; const baz = {foo}; baz//{foo:'bar ...
- web前端之es6对象的扩展
1.属性的简洁表示法 2.属性名表达式 表达式作为对象的属性名 3.方法的 name 属性 例如:函数的name 属性,返回函数名. 4.Object.is() ES 比较两个值是否相等,只有两个运算 ...
- C++ 类模板基础知识
类模板与模板类 为什么要引入类模板:类模板是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类 ...
- ES6 对象的扩展(上)
属性的简介表示法 允许直接写入变量和函数作为对象的属性和方法,这样的书写更简洁. function f( x, y ) { return { x, y }; } // 等同于 function f( ...
- ES6 对象的扩展(下)
属性的可枚举性 对象的每个属性都有一个描述对象(Descriptor),用来控制该属性的行为.Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象. var ob ...
- es6 对象的扩展
一.现在还有很多浏览器不能直接使用es6语法.特别是手机端的一些低版本的浏览器.都需要用bale转换一下. 但是目前流行的框架中(vue,react,angular).都有自己的脚手架,都能用webp ...
- ES6 对象的扩展 Object.assign()
Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target). const target = { a: 1 }; const source1 ...
- ES6 对象的扩展 Object.is()
ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===).它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0. ES6 提出“Same-va ...
随机推荐
- tab选项卡在鼠标经过时实现切换延迟
偶然间在浏览网页时,发现这样的效果.当鼠标不经意间滑过tab时并不会切换,当鼠标停留在上面一段时候后才会切换. 个人觉得用户体验不错,优点是1.当用户只是滑过标签,并不需要切换,而此时如果切换标签需要 ...
- 在IDEA中新建Spring Boot项目
新建项目 选择项目构建方式 选择项目依赖 新建项目成功后(Maven构建方式)
- proxysql 系列 ~ 读写分离核心功能
一 相关表介绍 1 mysql_user 列表配置 1 username && password 账号密码 2 default_hostgroup 默认的组ID2 mysq ...
- 顶层const
顶层const:指针本身是一个常量 底层const:指针所指对象是一个常量 顶层const可以表示任意的对象是常量,这一点对任何数据类型都适用,如算术类型.类.指针等 底层const则与指针和引用等复 ...
- ASP.NET MVC - 处理Html数据
HtmlAgilityPack 使用HtmlAgilityPack可以以面向对象的方式通过查找Html节点来获取页面元素.参考:http://html-agility-pack.net HtmlDoc ...
- js 一个对象的属性名是一个变量怎么处理?
1.这种方法的属性(setAttrName)可以是一个变量. var obj = {}; obj[setAttrName] = 'Tom' 2.这样就可以动态的给js对象添加变量属性. var obj ...
- MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)
先建立一张 m 表 mysql> create table m ( -> mid int, -> hid int, -> gid int, ), -> matime da ...
- tp5.0 结合 Redis Cache缓存风暴
方法介绍 1.sadd() 描述:为一个Key添加一个值.如果这个值已经在这个Key中,则返回FALSE. 参数:key value 返回值:成功返回true,失败false 2.delete() ...
- JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
https://blog.csdn.net/u012882327/article/details/69525166
- Akka Quickstart with Java-笔记
官方文档: http://developer.lightbend.com/guides/akka-quickstart-java/?_ga=2.177525157.1012573474.1504767 ...