今天再看js高级程序设计时突然对_proto_与prototype感到了困惑所以在搜索了相关的资料之后,我来总结一下两者的不同,哪一点不对还请大家指出来多谢指教!
首先_proto_是隐式原型而prototype是显式原型
_proto_的由来:当调用构造函数创建一个新的新的事例后,该实例的内部将包含一个指针(它是内部属性)在ECMA5中管这个指针叫[Prototype],当时在脚本中没有标准的方式访问[Prototype],但除了IE其他主流浏览器在每一个对象上都支持一个属性_proto_来访问[Prototype],而在其他实现中这个属性对于脚本完全不可见(这一点是js高级程序设计上说的我也不太理解,如果有懂的可以说一下吗),也可以用Object.getPrototypeOf()这个方法来返回这个对象的原型这是ECMA5中新增的一个方法。
function fresh(){
}
fresh.prototype.name="a";
fresh.prototype.year=22;
var a=new fresh();
a.name="b";
var b={};
alert(Object.getPrototypeOf(a)==fresh.prototype);//true
__proto__指向的是构造函数的原型对象,任何对象都有这个属性。这个链接是存在于实例与构造函数的原型对象之间的不是实例与构造函数之间。下面我就用几个例子来说明一下 __proto__与Prototype的关系。
function a(){
}
var b=new a();
alert(b.__proto__===a.prototype);//true
prototype:这个在js高级程序设计书中这样定义,只要创建一个函数就会根据一组规则为该函数创建一个prototype属性,他是指向函数的原型对象需要注意的是
Function的__proto__指向其构造函数Function的prototype;
Object作为一个构造函数(是一个函数对象!!函数对象!!),所以他的__proto__指向Function.prototype;
Function.prototype的__proto__指向其构造函数Object的prototype;
Object.prototype的__proto__指向null这是规定;
自己动手在控制台写变量来验证,并加深理解。
还有获取原型对象的一个方法 Object.getPrototypeOf()返回目标对象的原型对象
注意:原型最初只包含constructor属性,而且该属性也是共享的,因此可以通过对象实例访问。
function a(){
}
a.prototype.name="w";
var b=new a();
b.name="m";
alert(Object.getPrototypeOf(b).name);//这个例子是利用原型实现继承,是继承一个非常重要的思想
有一个方法用来确定对象之间是否存在某种关系,就是括号内对象的__proto__如果指向调用该方法对象的prototype就返回true
function a(){
}
a.prototype.name="w";
var b=new a();
b.name="m";
alert(a.prototype.isPrototypeOf(b));
constructor是作为prototype的属性存在的指向构造函数
var obj={};
alert(obj.__proto__.__proto__===null) //true
alert(obj.__proto__.constructor===Object) //true
alert(obj.__proto__.constructor.__proto__===Function.prototype) //true
alert(obj.__proto__.constructor.__proto__.__proto__===Object.prototype) //true 下面有图具体每一个阶段都对应谁,这个会了这个知识点就会了
谢谢您的观看,哪里不足或不正确欢迎指点!