Javascript原型链详解

来源:互联网 发布:nginx 安装 cgi 编辑:程序博客网 时间:2024/06/04 19:43


1、prototype属性仅属于类,即函数对象!!

2、__proto__属于所有对象,但是非标准规定,许多浏览器并不对外公开这个属性,Firefox暴露出这一属性,仅供开发人员理解,但不推荐开发中使用。而Object.getPrototypeOf()是标准所有的。

3、constructor属于所有对象,函数对象的constructor为 function Function(){。。。。}

4、alert()对对象的结果为[objectObject],建议用console.log(),可以在控制台打印出对象的详细信息。alert()对函数对象是显示整个的函数定义。

5、除Function.prototype类型为“function”,剩余所有的prototype的类型均为"object"。

 

6、原型链的意义:

      1、清楚对象的继承结构,知道它有哪些父类(父类:指的是该对象原型链向上方向的对象);比如Object.__proto__ == Function.prototype,所以Object  instanceof  Function。又Function.__proto__.__proto__== Object.prototype,所以Function instanceof Object. 

       a instanceof B运算符看的是该a对象原型链上的所有__proto__,若有B.prototype,则运算结果为true。具体见后面的文章,关于instanceof操作符的运算规则

      2、搜索对象的属性时,先会在类中查找,找不到就在其原型对象查找,再在该原型对象的原型链上查找,所以在Object.prototype对象上加属性,会为所有对象加上该属性。

 

7、某类的原型对象是该类的实例(除非显式指定),即 A.prototype.constructor == A

8、函数对象的原型对象是Function.prototype,是Empty函数对象,alert(Function.prototype)会显示function Empty(){},但是alert(Empty);或者alert(Function.prototype ==Empty)会报错,说Empty is not defined。

 

9、*.prototype.__proto__ ==Object.prototype,除了Object.prototype.__proto__ == null

10、alert(Function.prototype.prototype)显示undefined。

11、在 JavaScript 中,每个对象都保持着一块隐藏的状态 —— 一个对另一个对象的引用,也被称作原型。即__proto__属性。

12、new运算符的执行过程,及call()方法的作用。



13、拓展:

alert(typeof null);                              //object
alert(null instanceof Object);                   //false     !! null 不是Object的实例
alert(Object.prototype instanceof Object);       //false     !! Object.prototype.__proto__为null,而null不是Object的实例
alert(Child.prototype.constructor == Child)      //true         原型对象的constructor属性为该构造函数对象
alert(Child.prototype instanceof Child);         //false     !! 虽然Child.prototype.constructor == Child,但是Child.prototype的原型链上
                                                                                                               //没有Child的实例
alert(new Child() instanceof Child);             //true   new Child()的原型为Child.prototype,其Child.prototype.constructor==Child


所以不是所有的对象均为Object对象实例。应该是除了Object.prototype除外的所有对象均为Object对象的实例。

Object instanceof Object 为true,Function instanceof Function也为true。


参考:http://www.nowamagic.net/librarys/veda/detail/1648


代码:

 

<script language="javascript">function Base() {this.b=22;}function Child() {/*this.object = Object;this.object();*/this.base = Base;this.base();this.a = function() {window.alert(2);}}Child.prototype = Base.prototype;var c = new Child();alert(c instanceof Base);Object.prototype.a = function(){window.alert(4)};c.a();console.log(Child.prototype);alert(Object.prototype.constructor == Object);alert(Function.prototype.prototype);alert(Function.prototype != Empty);                   //报错,没有Empty对象//alert(Function.prototype);//alert(Object.prototype);//alert(Child.prototype == c.__proto__);//alert(Child.prototype == Object.getPrototypeOf(c));//alert(Object.prototype.constructor == Object);//alert(Object.__proto__ == Function.prototype);//alert(Function == Function.prototype.constructor);//alert(Object.prototype == Function.prototype.__proto__);//alert(Object instanceof Function);//alert(Function instanceof Object);     //Function 是 Function类的实例,而Function类的基类是Object,所以Function是Object的实例</script>


原型链


ps:上面图有个错误,对象是没有constructor属性的,它继承于其原型对象!!

0 0
原创粉丝点击