宝哥软件园

了解Javascript_06_了解创建对象的过程

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

简单代码我们先来看一个简单的代码:复制代码如下:函数克隆人(){}克隆人。prototype={name3360 '白痴的座右铭' } var clone01=new HumanCloningalert(clone 01 . name);//‘白痴的座右铭’警戒(克隆人01克隆人的实例);//true HumanClicking . prototype={ };alert(clone 01 . name);//‘白痴的座右铭’警戒(克隆人01克隆人的实例);//false var clone 02=new HumanCloning();alert(clone 02 . name);//未定义的警报(克隆02人类克隆的实例);//true在复杂理论JS中,只有函数对象(function)才有类的概念,所以要创建一个对象,就必须使用function对象。函数内部有[[Construct]]方法和[[Call]]方法,用[[Construct]]构造对象,用[[Call]]调用函数,只有使用新的运算符时才会触发[[Construct]]逻辑。注意:在这个例子中,自定义函数HumanCloning是一个函数对象,那么像object、string、number这样的局部对象也是函数对象吗?答案是肯定的,因为局部对象可以看作是函数的派生类型,在这个意义上,它们可以被看作是用户定义的函数。(对应《理解Javascript_04_数据模型》中的‘内置数据类型’一节)var obj=new Object();是使用内置函数Object对象创建一个实例化的对象obj。var obj={ };和var obj=[];这类代码会触发JS引擎对Object和Array的构造过程。函数fn(){ };var myObj=new fn();是使用用户定义的类型创建实例化对象。注:函数对象的具体概念将在后面的文章中解释。现在我们可以简单地把‘函数对象’理解为‘函数’的概念及其内部实现。结合这个例子,函数对象是HumanCloning,函数对象创建的对象实例是clone01和clone02。现在我们来看看var clone 01=new human cloning();实现细节(注意:函数对象的[[Construct]]方法负责实现对象的创建):1。创建一个内置对象obj并初始化它;2.如果HumanCloning.prototype是对象类型,则将clone01的这个内部[[Prototype]]设置为HumanCloning.prototype,否则clone01的[[Prototype]]将是它的初始值(即object.prototype)。使用args参数调用HumanCloning 3.1内部[[Call]]方法的内部[[Call]]方法来创建当前执行上下文(注意:执行上下文将在下面的博文中解释。文章《Javascript提速_01_引用变量优化》中对此进行了部分解释。)3.2调用humanclocking的函数体3.3销毁当前执行上下文3.4返回humanclocking的函数体返回值,如果humanclocking的函数体没有返回值,则返回undefined 4。如果[[调用]]的返回值是对象类型,则返回该值,否则返回obj attention。以下代码是步骤1、步骤2、步骤3的代码说明:复制代码的代码如下: var clone 01={ };//不可能在程序外访问[[原型]],只是为了理解//clone01。[[prototype]]=人类克隆. prototypehuman cloning . call(clone 01);请注意,在步骤2中,prototype指的是对象显示的Prototype属性,而[[Prototype]]表示对象内部的Prototype属性(隐式)。构成对象原型链的是内部隐式的[[原型]],而不是对象显示的原型属性。显示的原型仅在函数对象上有意义。从上面的创建过程可以看出,函数的原型被赋给了派生对象的隐式[[Prototype]]属性,从而根据原型规则,派生对象和函数的原型对象之间存在属性和方法的继承/共享关系。(也就是原型继承实现原理,正好是《理解Javascript_05_原型继承原理》的内容)注意3.4步的描述,我们来看一个昆飞的问题:

我觉得现在回答这个问题应该是小菜一碟。注:原地址http://www.planabc.net/2008/02/20/javascript_new_function/内存分析

一个简单的内存图和函数对象概念的引入也解释了上面的代码(相对来说,这个图不是很严格,但是容易理解)。这里还引出一个问题,instanceof的实现原理,我想大家都看到了一些苗头。实例的判断取决于原型链。具体实现细节请参考后续博文。局部和继承的属性对象可以通过隐式prototype链继承属性和方法,但是Prototype也是一个普通的对象,也就是说它是一个普通的实例化对象,而不是一个纯粹的抽象数据结构描述。所以存在局部属性和继承属性的问题。首先,我们来看看设置对象属性的过程。JS定义了一组属性,用于描述对象的属性,以显示属性是可以在JavaScript代码中设置,还是可以由for in枚举。obj.propName=value的赋值语句处理如下: 1。如果propName的属性设置为无值,则返回2。如果obj.propName不存在,它会为名为propName 3的obj创建一个属性。如果obj.propName的值设置为value,您可以看到。值设置过程不考虑原型链。原因很明显。obj的内部[[Prototype]]是一个实例化的对象,它不仅与obj共享属性,还可能与其他对象共享属性。修改它可能会影响其他对象。我们来看一个例子:复制代码如下:函数克隆人(){}克隆人。prototype={name : '白痴的座右铭' } var clone01=new HumanCloningclone 01 . name=' jxl ';alert(clone 01 . name);//jxl var clone 02=new human clone();alert(clone 02 . name);//傻子的座右铭:结果很清楚。对象的属性不能修改其原型中同名的属性,而只能创建同名的属性并为其赋值。参考。//www . JB 51 . net/article/25008 . htm

更多资讯
游戏推荐
更多+