Javascript讲解系列之一 Prototype原型链详解

   以前没有写博客的习惯,许多的技术积累顶多都是自己稍微总结一下,很少共享,不是自私,而是工作比较忙,老板们只喜欢你老老实实地干活,可是如果只干活不注重积累很容易成为公司工作的奴隶,学不到新东西,实力也难以提高;前几天接到一个电话面试被鄙视,才发现公司所用的DOJO并不被外面广泛接受,所学仅为九牛一毛,故而决定把自己所学分享出来,为夯实基础,也为多多与外界交流,形成一种渠道。如需联系,请发送至邮箱:[email protected]

   今天写Javascript系列之第一篇:Prototype原型链。在中关村软件园里随便拉一个码农估计都会写JS,大部分也都会知道JS是基于原型链的设计,但是如果问题JS原生对象(Object,Function,Array,Date等)的这个链到底长什么样子?估计能回答出来的人就少了,我开始也非常糊涂,后来决心一定要好好搞一下,花了2天功夫基本算是明白了,分享如下:

   准备环境:Firefox、Firebug;

   为了做好铺垫,先解释清楚一下的概念:

   1)类型、原生类型、对象类型(types、primitive types、object types)

   不像我们在学习JAVA时,被告知JAVA是完全OOP的语言,class是一类具有共同特点的抽象,object是某个class下具体的一个实现,Object类是所有类的顶层父类,对Java的学习是从类与对象开始的;Javascript则不然,它是从类型(type)开始入门,你在各类语言中遇到的number,string, boolean, object, function都属于类型。

   这些类型在JS中分为两大类:原生类型与对象类型,原生类型包括:number,string, bool, null, undefined;剩下的非原生类型对象都属于对象类型,包括:object, array, function等,那这里的object专指具有属性(attribute)的对象,下面以代码在Firebug中的输出示例。一般判断某个赋值是什么大的类型没有意义,往往是判断它是什么原生类型或者对象类型。

function log(arg){  console.log(arg);   }
var opts = Object.prototype.toString;
// 1) primitive types
log(typeof 1);                          // number
log(typeof "");                         // string
log(typeof false);                      // boolean
log(typeof undefined);                  // undefined
log(typeof null);                       // object       null是个特列,属于原生类型;
log(null instanceof Object);            // false
// 2) object types.
log(typeof new Object);                 // object
log(typeof new Function);               // function
log(typeof new Array);                  // object
                                                                                                                                                                                                 
log(opts.call(new Object));             // [object Object]
log(opts.call(new Function));           // [object Function]
log(opts.call(new Array));              // [object Function]

   如上面的代码所示,判断原生类型,使用typeof关键字就可以;判断对象类型呢,我们可以使用toString()方法来达到目的;


   2)prototype与__proto__的区别

   两者都是对象类型的两个属性,并非所有的对象类型都有prototype属性,一般只有function对象才有prototype属性(除非主动赋值),它指向的是一个对象,将来会被多个实例所继承(或者说该对象处于多个实例的原型链上);__proto__才是真正的原型链的实际指针,然而许多浏览器并不支持这个属性对外公开使用,Firefox却暴露出这一属性,以供方便了解。下面我们用一段代码来做验证:

// 1) prototype属性:一般只有function对象拥有
log((new Object).prototype);                    // undefined
log([].prototype);                              // undefined
log((new Function).prototype);                  // anonymous {}
                                                // Function, Object, Array是function对象
log(Function.prototype);                        // function()
log(Object.prototype);                          // Object {}
log(Array.prototype);                           // []
// 2) __proto__属性:指向该对象原型链的上一端
log((Object.prototype).__proto__);              // null
log((Function.prototype).__proto__);            // Object {}
log(Object.__proto__);                          // function()
log(Function.__proto__);                        // function()





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。