setPrototypeOf( '目标对象','要设置的值' )
getPrototypeOf( '目标对象' )
通过一个对象,生成一个新的对象:利用constructor找到构造函数
obj.--proto--.constructor
原型链检测 instanceof
(a instanceof b): 检测a的原型链上是否存在b构造函数的prototype
原型链检测 isPrototypeOf
isPrototypeOf:检测一个对象是否是另一个对象的prototype,只要目标对象的原型链上存在,就返回true
( a isPrototypeOf (b) ) 1.a对象是不是b对象的prototype; 2.b的原型对象是不是a
属性检测 in hasOwnProperty()
in关键字:检测一个属性是否属于一个对象自身,或原型链上
hasOwnProperty():检测一个对象自身是否包含一个属性
定义对象的原型
1.Object.create( '目标对象' , {' 定义属性'} ):创建一个新的对象,让创建出来的这个对象的prototype为目标对象
eg:
2.__proto__,设置原型对象( 这个是一个非标准的属性 )
__proto__的说明:
严格意义来说不是一个属性,原理是利用了setter和getter,当进行设置的时候会自动进行判断,如果设置的值是对象类型,则会生效,否则无效.
3.下面是标准的方法设置和读取原型
setPrototypeOf( '目标对象','要设置的值' )
getPrototypeOf( '目标对象' )
原型的继承
1.原型链继承
1.存在的问题 : 引用类型的值会共享
1.__proto__
2.Object.create( '目标对象' , {' 定义属性'} )
constructor需要重新设置
注意:如果利用Admin.prototype.constructor进行设置,那么constructor,是可以被for in 遍历的.
Object.defineProperty( '目标对象','属性名称',{ 配置项 })
2.构造函数继承
1.存在的问题 :没办法拿到super原型上的方法
3.组合继承(伪经典继承)
即原型链继承+构造函数继承
存在的问题: 调用了两次super函数
4.寄生组合继承(经典继承)
可以避免调用两次super函数