es6中的类和对象
class Star{
constructor(){
//构造函数
}
sing(song){
}
}
类必须用new实例化
继承
实例对象函数的调用时采用就近原则
class Father{}
class Son extends Father{}
super()
调用父类的构造函数和普通函数
子类需要调用父类函数时,必须先使用super()即先实现父类的构造函数再实现子类的构造函数
注意:
1、es6类没有变量提升,所以必须先定义类才能创建对象
2、类里面的公有属性和方法一定要加this使用
3、类里的构造函数里的this指向对象本身,而普通函数的this指向函数的调用者不一定是对象本身(经常定义一个全局变量that指向对象)
insertAdjacentElement()
element.insertAdjacentElement(position, element);
方法将一个给定的元素插入到相对于被调用的元素的给定的位置。
appendChild不支持追加字符串的子元素
'beforebegin': 在该元素的前面。
'afterbegin':只在该元素中,在第一个元素中。
'beforeend': 只是在该孩子的最后一个元素,在后面。
'afterend': 在该元素的后面。
匹配 <p> 的父元素的第一个<p>元素,选择的是所有身为长子的<p>
p:first-child
{
background-color:yellow;
}
<p>This paragraph is the first child of its parent (body).</p>//变黄色
<h1>Welcome to My Homepage</h1>
<p>This paragraph is not the first child of its parent.</p>
<div>
<p>This paragraph is the first child of its parent (div).</p>//变黄色
<p>This paragraph is not the first child of its parent.</p>
</div>
构造函数
es6之前没有类的概念,通过定义构造函数来实例化对象
function Star(){
}
var lbw = new Star();
实例成员:
需要通过实例化对象才能调用
静态成员:
只能通过构造函数名来访问
原型对象prototype
构造函数问题:构造函数里的成员函数每当实例化对象时都会生成相同的成员函数(复杂数据类型),冗余造成内存空间浪费
解决方法:利用原型对象:一般用来存放共享方法
对象原型__proto__
1、每个对象系统自动生成一个属性:__proto__指向构造函数的原型对象prototype。
2、非标准的属性,不可以使用该属性
__proto__===prototype
两者等价,指向内存中的同一块区域
3、如果我们给原型对象赋值了一个新的对象,那constructor这个属性会消失,得手动添加才能找到该对象的构造函数
原型链
实例化对象需要调用某个方法或者使用某个属性时利用__proto__属性(原型链)可以一层一层往上找
Star.prototype.constructor === Star()
lbw.__proto__ === Star.prototype
Star.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ === null
成员查找机制
利用原型链,逐级查找,就近原则,一般到Object.prototype的方法就够用了
原型对象this指向问题
this还是指向调用者即对象本身
扩展内置对象
Array.prototype.sum = function(){};
arr.sum();
call()
作用:调用这个函数,并且修改函数运行时this的指向
第一个参数为this的指向
借用构造函数继承父类属性
function Father(uname,uage){
this.uname = uname; //call完this就会指向Son生成的对象,即给儿子对象新增属性
this.uage = uage;
}
function Son(uname,uage,sore){
Father(this,uname,uage);//this指向Son生成的对象
this.sore=100;
}
借用构造函数继承父类方法
不能直接将父类原型对象地址赋值给子类原型对象,子变父也得变
Son.prototype = new Father();
//将子类原型对象的地址指向父亲的一个实例对象,通过父对象.__proto__找到父类原型对象,即可调用父类方法,并且有父类对象作中转站,子类原型对象怎么操作都不会影响到父类的原型对象,保持相对独立。
//方法调用路线
先在子类对象自身找 son
在子类原型对象找 son.__proto__->Son.prototype
通过父类对象在父类原型对象找 Son.prototype.__proto__->Father.prototype
Son.prototype.constructor = Son;
//子类原型对象赋予了一个父类对象,所以consructor得重置
es5新增方法
forEach()
arr.forEach(function(value,index,array)){
每个数组元素
每个元素的索引
数组本身
}
filter():
遍历数组筛选出新数组并返回这个新数组
var newArr = arr.filter(function(value,index,array){
return value%2==0
}
some():
查找唯一元素!返回布尔值,一旦满足了鉴定条件立即结束执行
var flag = arr.some(function(value,index,array){
return value<3;
}
forEach和some的区别
forEach(filter也是)中的retrun类似continue只能跳出本次循环,不会结束遍历
some中的return类似break,满足条件直接结束遍历(return true才表示找到了满足条件的元素)
字符串方法
trim()
去除字符串左右两侧的空格
对象方法
Object.keys()
获取对象所有属性所构成的数组
Object.defineProporty(对象名,'属性',descriptor)
descriptor的特性以{}对象的形式书写
value:属性值
wriable:true/false 该属性能否修改
enumerabl:true/false 该属性能否被枚举 默认为false
configurable:目标属性是否可以被删除或是否可以再次修改第三个参数里面的特性true|false 默认为false