_proto_
任何对象在创建时都会具有__proto__
属性,它指向构造该对象的构造函数的原型对象
实例化一个String对象 并输出
可以看到str有0、1、length、__proto__
四个属性,点开__proto__
str.__proto__
上存在着很多方法,所有String实例都可以共享这上面的属性和方法
prototype与constructor
任何构造函数在创建时都会具有prototype属性,指向当前构造函数的原型对象,在默认情况下,所有的原型对象都会自动获得一个constructor属性,该属性指回prototype属性所在的构造函数,
大多数情况下可以把__proto__
理解为构造器的原型即Object.__proto__===constructor.prototype
以下是一种特殊情况
原型链
js里一切都可以被当做对象,任何对象都会具有__proto__
属性。而js引擎在读取实例对象的属性时,如果存在普通属性中,就直接使用,如果找不到,就会查找与对象关联的原型中的属性,一直找到顶层(Object.prototype)。原型链上的对象靠__proto__
属性连在一起形成了一条链,称为原型链。
原型链中Function和Object之间的各种关系比较重要
首先记住对象祖先为Object.prototype,函数祖先为Function.prototype。
1.Object.__proto__ === Function.prototype // true
JS里Function既是构造函数也是对象。作为构造函数来看,任何函数都是Function构造出来的,Object是是函数对象,是Function构造的,所以Object.__proto__===Function.prototype
,
2.Function.__proto__ === Function.prototype // true
作为函数对象来看,Function是通过Function函数来创建,也就是自己创建自己
3.Function.prototype.__proto__ === Object.prototype //true
Function.prototype也是对象,继承于Object.prototype
hasOwnProperty
hasOwnProperty()返回一个布尔值,判断对象是否包含特定的自身(非继承)属性。
用法:object.hasOwnProperty(proName)
参数必须是以字符串的形式