对象是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的原型部分,如果有什么错误的地方,欢迎指出,拍砖~
欢迎关注我的订阅号,每周均有本人呕心沥血之作,请多多交流,请教~~~纯属技术交流,广告党就免啦~~谢绝不走。。