注意这个例子
var obj = {};
obj.toString(); //"{object object}"
上面的例子中,我们声明了一个空对象,并没有为他添加toString属性方法,但是这个方法却可以被成功的调用并输出。
原因在于javascript的对象都有一个内置的[[Prototype]]私有属性,这个属性指向另一个对象,我们称这个对象为原对象的原型。
当js引擎访问obj的toString属性时,首先会去obj对象查找,发现找不着,就沿着obj的[prototype]属性去他的原型上查找。
通过chrome开发者工具,我们可以看到这个obj圆形的真面目:
javascript空对象的原型,由于obj的原型对象定义了一个toString属性。所以,空对象也可以使用toString这个属性方法。
为什么要使用原型属性
原型的意义在于实现属性的继承。
eg,我们希望js的数字类型提供一个方法判断当前数字是否为奇数,没有原型的情况下,你只能这么做:
var num = new Number(99);
num.isodd = function(){return this % 2 !== 0};
num.isodd(); //true
但是这样是没有意义的,因为isodd()方法定义在num变量上面,其它的数字类型并不可以使用
var num2 = new Number(100);
num.isodd(); //num2.isodd is not a function;
有了原型的概念后,由于所有的数字类型都指向了同一原型,我们可以把isodd方法定义在这个原型上,这样所有的数字类型就可以调用到这个方法了
var num1 = 99,num2 = 100, num3 = 0;
Number.prototype.isodd = function(){return this % 2 !== 0};
num1.isodd();//true
num2.isodd();//false
num3.isodd();//false
原型链(略)
原型也不是一个特别的存在,他也只是一个普通的对象而已。换句话说,圆形也可以有属于他的原型。如果把对象的[[prototype]]方法想象成链条,就形成了一条原型链。