一.对象创建的方式
a.字面量创建
优点:简单
缺点: 1.无法批量创建相同对象
2.无法通过迭代的方式动态创建对象
b.工厂模式创建
function Factory(height,weight) {
var obj=new Object()
obj.height=height
obj.weight=weight
return obj
}
优点:可以快速创建相同类型对象
缺点: .无法明确实例类型,都是object
c.构造函数创建
优点: 决了工厂问题弊端,可以简单对应实例类型
缺点: 同样的方法会开辟不同的内部,造成大量的内存消耗
d.原型创建:将所有的共有的方法或者属性,绑定到构造函数的原型上
二、构造函数中的常用方法
1.isPrototypeOf() :判断对应对象是否是基于对应构造函数创建的
function Peoole(name,age){
this.name=name
this.age=age
}
var p1=new People("lyffy",18)
var bool=People.prototype.isPrototypeOf(p1) //true
而instance of与它的作用相反:
var bool=p1.instanceof Student //true
2.obj.hasOwnProperty(key): 判断当前key是否在其构造函数里
var bool=p1.hasOwnProperty("name") //T
需要注意,若属性和方法写在了构造函数的原型对象上,则返回false
3.key in obj:判断对象是否具备对应属性
只要构造函数里存在当前key(无论写在哪里),都会返回true
例子:编写一个方法判断对象的当前属性,是否是从原型中得到
function hasPrototype(obj,key) {
return key in obj && obj.hasOwnProperty(key)==false
}
二、面向对象编程
1.特点:
a.通过对象分析问题
b.封装性:将属性和方法维护封装到对象中,以节约维护成本,提高安全性(私有变量)
c,继承性:子类可以继承父类的属性与方法
d.多态性:一个类可以创建多种对象
2.继承性:
a.冒充继承:只能继承属性,无法继承方法
b.原型继承:可以继承父类方法,但无法对父类属性初始化,子类的所有实例对象属性都相同
c.混合继承:使用冒充继承来继承属性,原型继承来继承方法
3.call、apply、bind
相同点:都是改变this指向
不同点:a.call与apply都会立即调用函数,而bind不会
这里有个案例,实现点击按钮后禁用,三秒后自动恢复的功能
var btn=document.querySelector('button')
btn.onclick=function() {
this.disabled=true
setTimeout(function(){
this.disabled=false
}.bind(this),3000)
}
最开始setTimeout里的this是指向的windows对象,我们用bind将this的指向改为按钮btn后就可以实现该功能了,由于要求3s后再执行,所以这里用bind而不是用call
b,apply与call类似,区别在于参数为数组。
(关于call、apply、bind的底层实现方式,后续文章再详细介绍)
2585

被折叠的 条评论
为什么被折叠?



