javascript中每个对象除了本身的属性外,还有一个__proto__
属性,继承了父对象的方法和属性(形成原型链);而每个函数有个prototype
属性,该属性值是个对象,该对象函数自定义的一些属性方法外,还有两个属性,constructor
(其值一般为函数本身)和__proto__
(其值继承自父对象)。
console.log(Object.__proto__==Function.prototype);//true
Object的本质是函数对象,是通过new Function()创建,所以Object.__proto__
指向Function.prototype
console.log(Function.__proto__===Function.prototype);//true
同理,Function也是函数对象,因此Function.__proto__
同样指向Function.prototype
console.log(Function.prototype.__proto__==Object.prototype);//true
Function.prototype
作为一个普通对象,其__proto__
指向Object.prototype
console.log(Object.prototype.__proto__);//null
Object.prototype.__proto__
为null,即所有对象的原型链的终点。
let Aobj=new Object();
console.log(Aobj.__proto__==Object.prototype)
可见
- Javascript中所有的普通对象都是Object的实例,拥有
__proto__
属性,继承Object.prototype
的属性和方法。
2.prototype
属性是一个原型对象,拥有__proto__
和constructor
。
3.Object.prototype.__proto__
为null,即所有对象的原型链的终点。
console.log(Aobj.prototype);//undefined
可见,在普通对象中没有prototype
,但存在__proto__
和constructor
。
var fn = function(){}
console.log(fn.prototype);//Object {constructor: function}
console.log(fn.__proto__);//ƒ () { [native code] }
console.log(fn.constructor);//ƒ () { [native code] }
console.log(fn.__proto__==Function.prototype)//true
可见,函数拥有prototype
属性,同时函数也是一个对象,拥有__proto__
和constructor
。
下面,简单做一个示例
var Fn = function(){};
Fn.prototype.Hello = function(){
console.log("Hello World");
}
var f1 = new Fn();
f1.Hello();//Hello World
f1.say();//f1.say is not a function
console.log(f1.__proto__===Fn.prototype);//true
f1是Fn的实例,可以得出f1.__proto__=Fn.prototype
。当我们调用f1.hello()时,首先f1中没有Hello这个属性,于是,它会到他的__proto__
中去找,也就是Fn.prototype
,而我们在上面定义了Fn.prototype.Hello=function(){}
; 于是,就找到了对应的方法。
而我们调用f1.say()
时,在f1中没有say这个属性,去f1.__proto__
即Fn.prototype
中查找,仍然没有这个属性,去Fn.prototype的__proto__
,即Object.prototype
中查找,仍然没有,去Object.prototype的__proto__
查找,Object.prototype.__proto__为null
,即所有对象的原型链的终点。查找结束。最后返回错误。
最后 ,引入一个别人的总结
网友评论