js高级知识点(第三天)
1、继承
1.混入式继承
for in
使用for in 遍历1的属性,将所有的属性添加到例外一个对象上
这时候就可以称 对象2 继承自对象1
2.原型继承
利用对象的动态属性,为原型对象添加成员
直接替换原型对象
1.替换前的对象,在替换之后,所有的成员都丢失
2.替换原型对象的时候,需要手动去指向原型对象的constructor属性
利用混入式给原型对象添加成员
3.经典继承
var 对象1 = Object.create(对象2);
这个时候,创建出来的对象1继承自对象2
问:Object.create方法存在兼容性?
解决:
1.检测浏览器是否支持Object.create方法,如果不支持,直接手动给Object添加create方法
2.自定义函数,在函数内部判断浏览器是否支持Object.create方法,如果不支持,则手动创 建对象返回,否则直接调用。
javascript精粹中写道:
function create(obj){
let obj = {}
obj.__proto__ = obj;
return obj;
}
因为 __proto__不是通用的属性(有些浏览器不一定支持)所以不推荐使用
推荐:function create(obj){
if(Object.create){
return Object.create(obj)
}else{
function F(){
}
F.prototyp = obj;
return new F();
}
}
4.原型链
什么是原型链?
每个构造函数都有原型对象,每个对象都有构造函数,每个构造函数的原型对象都是对象,也就有构造函数
然后就形成一个链式的结构,我们称之为原型链
5.原型继承是什么?
通过修改原型链的结构,实现继承的方式就是原型继承。
6.对象和原型的成员关系
function Person(){}
var p = new Person();
p对象包含的成员有:Person.prototyp中的所有的成员和自身的成员。
Person.prototyp中的成员有:Object.prototyp的成员和自身的成员。
p对象可以访问Person.prototyp和Object.prototyp中的所有成员
7.Object.prototyp的成员
constructor:指向和该原型相关的构造函数
hasOwnProperty方法:判断对象本身是否拥有某个属性 p.hasOwnProperty(属性)
properIsEnumerable方法:1.判断属性是否属于本身对象,2.判断属性是否可以遍历
isPrototypeOf 方法 判断一个对象是不是另一个对象的原型对象 obj1.isPrototypeOf(obj2)
toString,tolocalString:将对象转为字符串 toLocalString转换成字符串的时候应用本地的设置格式
valueOf方法:在对象参与运算的时候,首先会调用valueOf方法获取对象的值,如果该值无法参与运算,将会调用toString方法
__proto__属性:指向对象的原型对象。
8.Function(3中创建函数的方式)
1.直接申明函数 function name(){}
2.函数表达式 var a = function(){}
3.new Function()
9.可以用Function来创建函数
var 函数名 = new Function() //创建一个空对象
var 函数名 = new Function('函数体') //创建一个没有参数的函数
var 函数名 = new Function('参数1','参数2','函数体')
反正最后一个参数为函数体,前面的参数为新参。Function接收的所有参数都为字符串类型
10.argument对象
argument对象是函数内部的一个对象,在调用函数的时候,系统会默认的将所有传入的实参存入改对象。(类数组)
注意:不管有没有形参,实参都会被传入改对象。
11.eval
可以将字符串转为js代码执行。
注意:当使用eval解析JSON格式字符串的时候,要注意,会将{}解析为代码段
1.可以在JSON格式字符串前面拼接“var 变量名 = ”
eval("var 变量名= "+JSON格式的字符串)
2.可以在JSON格式字符 串前后拼接()
eval((JSON格式的字符串))
12.静态成员和实例成员
1.静态成员
通过构造函数去访问的属性和方法就是静态成员
2.实例成员
通过对象(实例)去访问的属性和方法就是实例成员