你的位置:首页 > Java教程

[Java教程]javascript对象原型及构造函数介绍


     对象是js中的一种基本的数据类型,除了可以给自身附属性外,javascript对象还可以从一个称为原型的对象继承属性。这种“原型式继承”是javascript的核心特征。

     在javascript中,创建一个对象通常可以有三个方法,对象直接量,关键字new和Object.create()函数。接下来会对这些技术稍作讲述,然后引出原型及构造函数。

     一:对象直接量

      对象直接量是一个表达式,这个表达式的每次运算都创建并初始化一个新的对象。下面有一些例子:

        var o = {};     //这个方法和var o =new Object();一样。

        var object = {'x':1,'y':2};

        var word = {'word':'hello',"sayHello":function(){}};

      二:通过new创建对象

      new运算符创建并初始化一个对象,往往后面跟着一个构造函数的调用,就像这样:

        var o = new Object(); //创建一个空对象 跟{}一样

        var a = new Array();

        var d = new Date();

除了一些内置的构造函数以外,也可以自定义构造函数用来初始化新对象。

    function A(){     //构建的构造函数一样要求首字母大写的习惯

    };

    var a = new A();  

    三. Object.create()

    ECMAScript5定义了一个名为Object.create()的方法,它创建了一个新对象,其中第一个参数是这个对象的原型。诸如:

    var o = Object.create({'x':1,'y':2});  //o继承了属性x,y

    var o2 = Object.create(Object.prototype); //这种方法和{}及new Object()一样

 但是这个有个特殊的存在,var o1 = Object.create(null);  //o1将不继承任何属性,null不存在任何原型对象。

进入正题

   OK,到现在介绍完了对象的创建,我们再简单解释下原型。每一个javascript对象(null除外)都和另一个对象相关联,“另一个”对象就是我们熟知的原型,每一个对象都从原型继承属性。

      所有通过对象直接量创建的对象都具有同一个原型对象(Object.prototype)。通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。就好像通过new Array ( )创建的对象的原型就是Array.prototype , 通过new Function()创建的对象的原型就是Function.prototype。通过Object.create(xx)创建的对象的原型就是其传进去的参数。

     没有原型的对象不多,null及Object.prototype都是,他们不继承属性。其他的原型对象都是普通对象,普通对象都具有原型。所有的构造函数都具有一个继承自Object.prototype的原型。举个例子,var f = new Function(); f对象的属性继承了Function.prototype,而Function.prototype又继承了Object.prototype,这一系列链接的原型对象就是所谓的“原型链”(prototype chain)。一个对象的__proto__ 属性和自己的内部属性[[Prototype]]指向一个相同的值 (通常称这个值为原型),原型的值可以是一个对象值也可以是null(比如说Object.prototype.__proto__的值就是null).

    举个例子:

    s是String构造的实例,它指向String的原型(String.prototype),String的原型指向Object.prototype,Object.prototype的原型指向null。

   接下来谈谈构造函数 

    尽管构造函数不像原型那样基础,但构造函数是类的“外在表现”。构造函数的名字通常用作类名。常见的内置构造函数有Object,Array,String,Function,Number等,任何js的函数都可以用来作为构造函数,并且调用构造函数是需要用到一个prototype属性的。这个属性是一个对象,这个对象包含唯一一个不可枚举属性constructor,constructor属性的值是一个函数。

    而且,例子中可以看到构造函数的原型中的constructor属性等于这个构造函数本身,这也就意味着对象通常继承的constructor均指代它们的构造函数。

接下来会有一个问题。

Function,String构造函数均是对象,它们的原型指向都是对象原型,所以它们都是Object的实例,那么,String,Function这些构造函数和Function有什么关系呢?Object instanceof Function的结果是什么呢?

事实证明:

解释如下:
   javascript里一切都可以当作对象来看待,构造函数本身也是对象,它们都是由Function实例化来的,它们(指的String等本身,而不是它们的原型对象)的原型指向Function.prototype.所以,它们也都是Function的实例对象。

 

本文实属个人理解js的原型部分,如果有什么错误的地方,欢迎指出,拍砖~


欢迎关注我的订阅号,每周均有本人呕心沥血之作,请多多交流,请教~~~纯属技术交流,广告党就免啦~~谢绝不走。。