手机版

Javascript新关键词之谜及其他

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

(续)先看一张对老手来说不新鲜,但对菜鸟来说很有趣的图片:

那是什么鬼东西?简直就是一个乱论。新的,抛开上图,看看上一篇留下的第二个问题。让我们在构造函数的函数体中添加一些东西,看看会发生什么。函数A(){this.p=1}var a=new A()将得到以下结果:

为什么用新关键字构造的a会得到属性p?新的A()代码做了什么?根据上一篇文章中Function的创建过程的第4步,对象A会有一个construct属性(注意它不是Constructor,但是Construct是ECMAScript标准中的一个属性,外界似乎看不到它),这个属性的值就是一个函数,所以new A()会调用A的这个Construct函数.那么这个Construct函数会做什么呢?1、创建一个对象,假设它叫做X.2.如果A.prototype是一个对象(通常),将A.prototype分配给x. _ _ prototype _ _否则(不常见),请大老板Object把Object.prototype分配给x.__proto__。3、调用A.call(x),第一个参数传递到我们刚刚创建的x中。就这样。a的函数体中的this.p=1,这就是x,因此,x具有p的性质,x.p=1。4、通常情况下,返回x,然后A就是x,但是也有特殊情况,如果A的函数体中返回了什么东西,它的typeof就是一个对象。那么a不是指向x,而是指向a函数返回的内容。伪代码如下:var x=new Object();//其实不一定要用new创建,我也不知道。x . _ _ proto _ _=a . prototype var result=a . call(x)if(type of(result)=' object '){ return result;}返回x;在我们的例子中,a函数返回undefined(因为没有返回字),所以a是x,但是我们举一个例子来验证上面步骤4中的特殊情况:

果然。看看上一篇文章剩下的第一个问题,function base(){ } base . prototype . a=1 varbase=new base();函数派生类(){ }派生类. Derived.prototype=baseVar=newderived()执行完上面的代码,myBase.constructor很容易就能猜到是Base。d.constructor呢?它是衍生的吗?

不,它也是基地。这是怎么回事?很简单。回顾上一篇文章的内容,我们知道既然D本身没有构造函数属性,我们就来看看d.__proto__,它是派生类. prototype,也就是对象基类,基类没有构造函数属性,所以我们就上基类。_ _ proto _ _ _,即base。它有一个构造函数属性,也就是Base本身。其实据我所知,只有构造函数的原型(函数类型的对象)才真正拥有构造函数属性的对象,并且“constructor . prototype . constructor===constructor”。那么,实例呢?

从图中可以看出,d是基础、派生和对象的实例。很有道理,但是怎么判断呢?如果constructor.prototype在x的prototype(_ proto _)链中,那么constructor的x instanceof的表达式返回true,显然,d的__proto__链是派生出来的。原型,基地。原型和对象。原型,所以图中的结果毫无疑问。因此,instanceof与对象的构造函数属性无关。函数与对象终于回答了文章开头的图。function和Object也是Function类型的对象,所以可以说都是Function()构造的东西(不知道是不是这样,但这么想还是挺有道理的。也就是说,我们可以想象下面的代码:var function=new function()var object=new function()根据前面文章的规律,会有函数。_ _ proto _ _==函数。原型和对象。_ _ proto _==函数。原型,验证一下:

对象的函数实例,这是显然为真实的的,万物归目标管功能的__原型_ _链依次指向:功能。原型,对象。原型。对象实例函数,因为功能。原型在目标的__原型_ _链中,所以也为真的。

版权声明:Javascript新关键词之谜及其他是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。