OOP概念##
Paste_Image.pngOOP特点:抽象、封装、继承、多态
prototype属性与原型##
创建一个
函数Foo
时,Foo
会有一个prototype
属性,并默认有两属性:
Foo.prototype.constructor
和Foo.prototype.__proto__
其中,Foo.prototype.__proto__
就是Foo.prototype
的原型
Foo.prototype.__proto__
又指向Object
的prototype
属性,即Object.prototype
Foo.prototype
的作用:
当使用var obj = new Foo() ;
生成Foo
的实例obj
时,Foo.prototype
对象属性会当作obj
的原型obj.__proto__
Paste_Image.png
prototype
属性与原型__proto__
的关系:
prototype
是构造器(函数对象)上面预置的对象属性,原型__proto__
是对象(实例对象)上的原型
对象的原型__proto__
指向其构造器的prototype
属性
实现继承的实例##
person
直接调用this
会指向全局对象window
Student.prototype = Object.create(Person.prototype);
1.创建一个空对象,且空对象的原型指向参数Person.prototype
2.然后把这个创建出来的空对象赋值给Student.prototype
。实现对象的原型链继承,而且不影响到原始对象Person.prototype
3.Object.create
只传第一个参数时,是创建原型指向参数的空对象。但是其第二个参数是可以设置新对象的属性及权限
Paste_Image.png
Person.call(this,name,age)
的意思就是使用Person
对象代替this
对象,那么student
中不就有Person
的所有属性和方法了吗,student
对象就能够直接调用Person
的方法以及属性了
再谈原型链##
Paste_Image.pngPaste_Image.png对象原型一般不暴露,但是有两种方式可以访问:在chrome浏览器可以使用
obj._proto_
来查找obj
的原型
在ES5里面可以使用Object.getPrototypeOf(obj)
来查找obj
的原型
5
Object.create(null)
建立一个空对象把原型链指向null,null没有原型链;
Paste_Image.pnges5的
bind方法
返回的函数没有prototype
属性
修改prototype属性产生的影响##
Paste_Image.png动态修改
prototype
属性时,会影响已经创建或者新创建的对象实例
修改了整个prototype
,赋值为新的对象,则不会影响已经创建的对象实例,但会影响后续新创建的实例
内置构造器的prototype##
Paste_Image.png假如绝大多数对象上希望有某个属性
x
;所以设置,Object.property.x=1;
想要不会有边界效应——for in
的时候会把这个x遍历出来。
可以通过defineproperty
设置相应的属性,enumerable
。
instanceof##
Paste_Image.png
<value> instanceof <Type>
:右边是函数或函数构造器,否则会报错,左边是一般是对象,否则会返回false,判断右边函数或者构造器的prototype
属性是否出现在左边的原形链上
可识别所有对象类型,不识别原始类型。
基于原型链。
不同window
或iframe
之间不能用instanceof
来检测类型。
实现继承的方式##
1禁止使用,修改子类时会一并修改父类
2不推荐使用,使用Person
的构造器创建会带回Person
的参数
3理想的继承方式【ES5之后才支持】,可以用右侧的方法进行兼容。(返回一个空对象,并且原型指向参数)
用new F;
创建一个对象时,该对象的原型指向构造器的prototype属性
网友评论