菜鸟教程定义:
prototype 属性允许您向对象添加属性和方法
注意: prototype 是全局属性,适用于所有的Javascript对象,且<prototype>
为对象的内部属性(切记),不能直接object.xxx
访问,需要用原型访问器访问。
一,基本用法:
//基本用法
//函数
function my() {}
var My = new my();
My.a = 1;
my.prototype.b = 3;
my.prototype.c = function (){
console.log(My.a);//1
console.log(My.b);//3
}
My.c();
//方法
var myobject = {}
myobject.constructor.prototype.a = 1;
myobject.constructor.prototype.b = 3;
myobject.constructor.prototype.c = function (){
console.log(myobject.a);//1
console.log(myobject.b);//3
}
myobject.c();
二,每个创建函数(不是js中自带函数方法且为函数),都默认存有有属性prototype,且其值为对象(内存在一默认属性constructor【值为本身的创建函数】),如图:
代码:console.log(function () {});
结果:
然而,我们看看js函数方法:
它只有内部属性<prototype>
,并没有prototype属性。
三,prototype属性实现原理
其实,prototype说明是允许用户往对象中增添属性,但是真正的不是增加对象构造函数属性,而是增加其内部属性对象的属性。
代码验证:
function my () {
this.x = 1;
}
var My = new my();
my.prototype.y = 2;
my.prototype.z = 3;
my.prototype.operate = function () {
console.log(My.x);//1
console.log(My.y);//2
console.log(My.z);//3
console.log(My);
}
My.operate();
运行截图:
由结果可知:
虽然对象My
都可以用.xxx
访问,但是他们的储存位置是不一样的。
这是因为:
每个由构造器创建的对象,都有一个隐式引用 ( 叫做对象的原型 ) 链接到构造器的“prototype”属性值。再者,原型可能有一个非空 (non-null) 隐式引用链接到它自己的原型,以此类推,这叫做 原型链 。当向对象的一个属性提出引用,引用会指向原型链中包含此属性名的第一个对象的此属性。换句话说,首先检查直接提及的对象的同名属性,如果对象包含同名的属性,引用即指向此属性,如果该对象不包含同名的属性,则下一步检查对象的原型;以此类推。
例如:如果在函数my
中加一句this.y = 3;
,则结果为
console.log(My.x);//1
console.log(My.y);//3
console.log(My.z);//3
所以,可知prototype属性是往对象的构造函数的父类进行添加属性,已达到以构造函数构造的对象可以访问用户所添加的属性。