定义对象进阶&Object&hasOwnProperty()&create()&call、apply、bind函数&继承&静态属性&私有属性&this指向
定义对象进阶
1.构造函数方式
这种方式定义的对象会占用很多内存,因为每个对象创建单独的空间,存储各自的内容
2.原型对象方式
缺点:当改变一个对象的引用类型的属性后,其他对象也发生了变化
3.混合方式定义
混合是指构造函数方式和原型对象方式混合,将属性放到构造函数内部,将成员方法放到原型对象中。
节省内存,而且又能将函数区分开
4.动态混合方式
类似于单例模式的写法
Object
Object是JS内置的一个构造函数
Object函数也有原型对象
所有自定义对象,它的原型对象都是Object对象。所以自定义对象可以使用Object函数中的成员,也可以使用Object原型对象上的成员
hasOwnProperty()
hasOwnProperty方法是Object函数的原型对象上的方法。
hasOwnProperty方法用于检测实例对象是否有非继承的属性,也就是自身有该属性。
create()
create()方法是Obejct构造函数内的成员方法,而且是一个静态方法(调用方式是直接使用Object来调用)。
create()方法用于创建对象,创建对象的时候,可以指定对象的原型对象。
var o = Object.create({原型对象}, {o对象的内容});
var o = Object.create({父对象}, {子对象o本身});
call、apply、bind函数
这三个函数都可以改变函数内部this的指向
函数.call(希望this指向的对象,参数1, 参数2…); 调用之后,会直接执行函数
函数.apply(希望this指向的对象,[参数1, 参数2…]); 调用之后,会直接执行函数
函数.bind(希望this指向的对象,参数1, 参数2…); 调用之后,不会执行函数。
继承
冒充继承
父类.call(子类的对象, 其他参数); //意思是让子类的对象,去代替父类中的this。
原型链继承
通过prototype实现,指定B的原型对象为A的实例
create()继承
var o = Object.create({原型对象}, {o对象的内容});
静态属性
静态方法的特点就是可以直接使用构造函数来调用
把属性直接定义到构造函数上即可。调用的时候,也是直接使用构造函数来调用。
私有属性
私有属性其实就是函数内部的局部变量。
this指向
this永远指向一个对象。
this指向的对象是谁,关键要看this运行的环境。也就是this所在的函数被赋值给哪个对象了,那么this就表示这个对象。
全局环境下,this表示window对象。
事件处理函数中,this表示绑定事件的DOM对象。
面向对象中的this表示函数所属的对象。
定时器中的this
setTimeout(obj.fn, 1000); // 执行的时候,fn 所在的环境丢失。this容易发生改变
setTimeout('obj.fn()', 1000); // 执行的时候,fn还在obj对象环境中,this不会发生变化