手机版

js中构造函数和原型的深入分析

时间:2021-10-10 来源:互联网 编辑:宝哥软件园 浏览:

当我们定义一个函数时,默认情况下函数本身会有一个原型属性,但是如果我们使用新的运算符来生成一个对象,就不会有原型属性。我们来看一个例子,说明这个复制代码如下:函数a(c){ this . b=c;this . d=function(){ alert(this . b);} } var obj=new a(' test ');alert(type of obj . prototype);//undefine alert(a . prototype的类型);//对象从上面的例子中,我们可以看到函数的prototype属性指向另一个对象,这就是prototype对象。请看下图

A.prototype包含两个属性,一个是构造函数,另一个是__proto__。这个构造函数就是我们的构造函数a,很容易理解。那么什么是原型呢?这就涉及到原型链的概念:每个对象都会初始化其中的一个属性,即__proto__。当我们访问一个对象的属性时,如果这个对象中不存在这个属性,他会在__proto__中寻找这个属性,而这个__proto__会有自己的__proto__所以他会一直寻找。看看mozzlia对它的描述,当一个对象被创建时,它的_ _ proto _ _属性被设置为construction函数的sprototype属性。例如varfred=new employee();会导致弗雷德。_ _ proto _ _=Employee.prototype。这在运行时用于查找没有直接在对象中声明的属性。例如,当whenfred.doSomething()被执行,并且fred不包含ado某物时,fred。_ _ proto _ _被选中,指向Employee.prototype,其中包含一个东西,即Fred。_ _原型_ _。do某物()被调用。请注意_ _ proto _ _是实例的属性,而照片类型是其构造函数的属性。信不信由你,我们来看看图片

如果添加alert (obj。_ _ proto _ _==a.prototype)//true在最后,这里我们将分析一下新的运算符做了什么。var obj={ };也就是说,对象obj被初始化。物体。_ _ proto _ _ _=a . prototype;a . call(obj);也就是说,构造obj也可以称为初始化obj。让我们把这个例子变得更复杂一点。复制的代码如下:函数a(c){ this . b=c;this . d=function(){ alert(this . b);} } a . prototype . test=function(){ alert(this . b);} var obj=function(){ } obj . prototype=new a(' test ');obj . prototype . test1=function(){ alert(22222);} var t=new obj(' test ');t . test();//alert(' test ');让我们通过var t=new obj('test ')来分析这个过程;我们可以得到t.__proto__=obj.prototype,但是obj.prototype=new a('test ')在上面有说明。你可以看看obj.prototype=p,p=new a(' test ');p . _ _ proto _ _ _=a . prototype;然后是obj。原型。_ _ proto _ _=a. prototype,从t.__proto__=obj.prototype,我们可以得到t.__proto__。_ _ proto _=a. prototype,所以对象t首先去查原型本身是否有测试功能,发现没有。结果我们上到了更高的层次,也就是t.__proto__,也就是obj.prototype找测试函数,但是obj.prototype没有这个函数,然后就查了。也就是t \u proto \u。__proto__,因为t. __proto__。_ _ proto _=a.prototype在a.prototype和output alert('test ')中找到了这个方法,从这个分析中可以得出一个结论,js中原型链的本质在于_ _ proto。this . d=function(){ alert(this . b);} } var obj=new a(' test ');alert(obj . constructor);//函数a(){ } alert(a . prototype . constructor);//函数a(){}根据上面提到的__proto__,首先obj没有构造函数属性,而是obj。_ _ proto _ _=a.prototype从a.prototype找,a.prototype.constructor只是a,两者的结果是一样的。

版权声明:js中构造函数和原型的深入分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。