javascript中的原型,原型链以及闭包(3)---------------prototype原型

菜鸟教程定义:
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属性是往对象的构造函数的父类进行添加属性,已达到以构造函数构造的对象可以访问用户所添加的属性。

猜你喜欢

转载自blog.csdn.net/h1234561234561/article/details/86662188