javascript new关键字的原理,js new的过程发生了什么

JavaScript中的“ new”关键字是什么?

它创建一个新对象。这个对象的类型就是object。

它将这个新对象的内部不可访问的[[prototype]](即proto)属性设置为构造函数的外部可访问原型对象(每个函数对象都会自动具有prototype属性)。

它使this变量指向新创建的对象。每当this提及时,它都会使用新创建的对象执行构造函数。除非构造函数返回非null对象引用,否则它将返回新创建的对象。在这种情况下,将返回该对象引用。

注意:构造函数是指new关键字后面的函数,如newConstructorFunction(arg1,arg2)完成此操作后,如果请求新对象的未定义属性,则脚本将改为检查对象的[[prototype]]对象的属性。

这就是您可以获得类似于JavaScript中传统类继承的方式的方法。关于这一点,最困难的部分是点号2。每个对象(包括函数)都具有称为[[prototype]]的内部属性。

它可以只被在创建对象的时间与设置,无论是新的,具有的Object.create,或者基于文本(函数默认Function.prototype的,数字到Number.prototype等)。

只能使用Object.getPrototypeOf(someObject)读取它。有没有其他的方式来设置或读取此值。

除了隐藏的[[prototype]]属性外,函数还具有一个称为prototype的属性,您可以访问和修改此属性,以为您创建的对象提供继承的属性和方法。

谷歌人工智能写作项目:小发猫

javascriptnew的时候为什么会执行构造函数?

js中定义的对象是通过new关键字来调用构造函数来产生对象的typescript自学入门,typescript 入门。functionOuser(user,pwd){//构造函数。

=user;=pwd;=get;returnthis;}创建对象的时候:vartanya=newOuser("tanya","123");。

javascript中new是什么意思

new是用来实例化一个对象的,newDate()是用来实例化一个事件对象,然后赋值给变量d,this就是这个对象的意思,在js中这个this变化多端,具体参照下面的,不过说实话,作为新手,想通过一两篇文章就想彻底理解this还是省省吧,这要通过很多的练习及思考,楼主不要心急,最好买本书好好看看,现在的人太浮躁了DouglasCrockford大师把this古怪的行为解释为和函数的调用模式有关。

js中有四种调用模式---方法、函数、构造器以及apply调用模式,它们在初始化this时候是不一样的。

1)方法模式简单的说就是使用点表达式或是下标表达式来调用这里定然是有对象的这种情况下this的绑定发生在调用的时候绑的自然是调它的那个对象了。

作为方法调用的函数有一个非常重要的属性:在方法体中,用来调用方法的对象成为关键字this的值。2)函数模式这个就更简单了,函数名加调用运算符('()')。

不过要小心,这个this绑的可是全局对象,不管你写哪了。(可以理解成你不给我指明了我就自己给它加个全局对象)当一个函数作为函数调用而不是方法调用时,这个this关键字引用全局对象。

容易混淆的是,当一个嵌套的函数(作为函数)在一个包含的函数中调用,而这个包含的函数是作为方法调用的,这也是成立的:this关键字在包含的函数中有一个值,但是它却(不太直观地)引用嵌套的函数体的内部的全局对象。

看个例子吧vara='global';varobj={a:'local',test:function(){functiontest1(){alert(this.a);//global}alert(this.a);//localtest1();}};();/*****************************解决这个问题的方法*****************************/vara='global';varobj={a:'local',test:function(){varthat=this;functiontest1(){alert(that.a);//local}alert(this.a);//localtest1();}};();3)构造器调用模式一句话就是用new来调用的new的时候this就绑定到新对象上了比较好理解(1)new运算符后面必须跟着一个函数调用。

new创建了一个新的没有任何属性的对象,然后调用该构造函数,把新的对象作为this关键字的值传递。(2)构造函数通常没有返回值。它们初始化作为this的值来传递的对象,并且没有返回值。

但一个构造是允许返回一个对象值,并且如果它这么做,返回的对象成为new表达式的值。在此情况下,作为this的值的对象会被抛弃。可参考jQuery构造函数。

4)apply,call调用模式apply,call是函数对象的方法,你想把谁绑定到this就直接把它作为第一个参数传给apply或call就好了。

ECMAScript规范给所有函数定义了两个方法call()和apply(),使用这两个方法可以像调用其他对象的方法一样调用函数。

call()和apply()的第一个参数都是要调用的函数的对象,在函数体内这一参数是关链字this的值。call()的剩余参数是传递给要调用的函数的值。

javascript中new是什么意思

new创建对象的符号。比如newObject(),newArray()this可以代表对象,比如this可以代表window,也可以代表某个元素。具体的要看this所处的当前作用域。

Date是日期对象,用的时候要实例化。实例化:d=newDate()操作对象,主要是操作对象的属性和方法。

javascript中的new有什么用

new是用来实例化一个对象的,比如:d=newDate(),newDate()是用来实例化一个事件对象,然后赋值给变量djs中有四种调用模式---方法、函数、构造器以及apply调用模式构造器调用模式一句话就是用new来调用的new的时候this就绑定到新对象上了比较好理解(1)new运算符后面必须跟着一个函数调用。

new创建了一个新的没有任何属性的对象,然后调用该构造函数,把新的对象作为this关键字的值传递。(2)构造函数通常没有返回值。它们初始化作为this的值来传递的对象,并且没有返回值。

但一个构造是允许返回一个对象值,并且如果它这么做,返回的对象成为new表达式的值。在此情况下,作为this的值的对象会被抛弃。可参考jQuery构造函数。

4)apply,call调用模式apply,call是函数对象的方法,你想把谁绑定到this就直接把它作为第一个参数传给apply或call就好了。

ECMAScript规范给所有函数定义了两个方法call()和apply(),使用这两个方法可以像调用其他对象的方法一样调用函数。

call()和apply()的第一个参数都是要调用的函数的对象,在函数体内这一参数是关链字this的值。call()的剩余参数是传递给要调用的函数的值。

javascript中var s=new fun; 和var s=new fun();有什么区别? 10

js创建数组对象的过程有几种?特点是什么?

js编程中创建对象的几种方式,如原始方法、工厂方法等创建对象。

1、原始方法复制代码代码示例:varobj=newObject();="Koji";//为对象添加属性=21;obj.showName=function(){//为对象添加方法alert();}obj.showAge=function(){alert();}obj.showName();//Kojiobj.showAge();//21上面的方式通过new关键字生成一个对象,然后根据JS是动态语言的特性添加属性和方法,构造一个对象。

其中的this是表示调用该方法的对象。这种方式的问题是如果需要多次创建对象,则需要重复代码多次,不利于代码的复用。

2、工厂方法:复制代码代码示例:functioncreateObj(){varobj=newObject();//创建对象="Koji";=21;obj.showName=function(){alert();}obj.showAge=function(){alert();}returnobj;//返回对象}varobj1=createObj();varobj2=createObj();obj1.showName();//Kojiobj2.showAge();//21这种方式提高了代码重用率,还可以改变工厂方法,传入参数赋值。

复制代码代码示例:functioncreateObj(name,age){//构造对象时可以传入初始化参数varobj=newObject();//创建对象=name;=age;obj.showName=function(){alert();}obj.showAge=function(){alert();}returnobj;//返回对象}varobj1=createObj("Koji",22);varobj2=createObj("Luo",21);obj1.showName();//Kojiobj1.showAge();//22obj2.showName();//Luoobj2.showAge();//21上面的方式虽然可以提高代码的复用率,但和面向对象中类的概念相比有一个很大的缺陷。

面向对象强调对象的属性私有,而对象的方法是共享的。而上面的工厂方法创建对象的时候要为每个对象创建各自私有的方法。同时由于为每个对象都创建逻辑相同的方法,浪费内存。

改进如下:复制代码代码示例:functioncreateObj(name,age){varobj=newObject();//创建对象=name;=age;obj.showName=showName;obj.showAge=showAge;returnobj;//返回对象}functionshowName(){//函数也是一个对象alert();}functionshowAge(){alert();}varobj1=createObj("Koji",22);varobj2=createObj("Luo",21);obj1.showName();//Kojiobj1.showAge();//22obj2.showName();//Luoobj2.showAge();//21上面通过定义连个函数对象,解决了不同对象持有函数对象的私有问题。

现在所有对象的方法都持有上面两个函数的引用。但这么一来的话,对象的函数又和对象成了相互独立,不相干的了。这和面向对象中特定方法属于特定类的思想不符合。

3、构造函数方式复制代码代码示例://定义一个构造函数,用来生成对应的对象,可以类比Java中的构造函数functionPerson(name,age){//当调用newPerson的时候,在执行第一行代码前,先生成一个Person对象,并将对象在内存中的//索引赋值给this关键字,此时可以通过this关键字操作新生成的对象,如下面的添加属性或方法=name;//this关键字不能少。

为当前对象,即this关键字引用的对象的name属性赋值//,实际相当于为当前对象添加name属性后,再为其name属性赋值。

=age;this.showName=function(){//为当前对象添加方法alert();}this.showAge=function(){alert();}//将当前对象返回给赋值符号左边的变量(不必明确使用return)}varobj1=newPerson("Koji",22);//生成一个Person对象varobj2=newPerson("Luo",21);obj1.showName();//Kojiobj1.showAge();//22obj2.showName();//Luoobj2.showAge();//21构造函数的方式和工厂方式一样,会为每个对象创建独享的函数对象。

当然也可以将这些函数对象定义在构造函数外面,这样又有了对象和方法相互独立的问题。

原型方法:该方法利用的对象的prototype属性复制代码代码示例:functionPerson(){}//定义一个空构造函数,且不能传递参数//将所有的属性的方法都赋予prototype属性="Koji";//添加属性=22;Person.prototype.showName=function(){//添加方法alert();}Person.prototype.showAge=function(){alert();}varobj1=newPerson();//生成一个Person对象varobj2=newPerson();obj1.showName();//Kojiobj1.showAge();//22obj2.showName();//Kojiobj2.showAge();//22当生成Person对象的时候prototype的属性都赋值给了新的对象。

那么属性和方法是共享的。该方法的问题首先是构造函数不能传参,每个新生成的对象都有默认值。其次,方法共享没有任何问题,但是属性共享就有问题,当属性是可改变状态的对象的时候。

例子:复制代码代码示例:functionPerson(){}//定义一个空构造函数,且不能传递参数=22;Person.prototype.array=newArray("Koji","Luo");Person.prototype.showAge=function(){alert();}Person.prototype.showArray=function(){alert(this.array);}varobj1=newPerson();//生成一个Person对象varobj2=newPerson();("Kyo");//向obj1的array属性添加一个元素obj1.showArray();//Koji,Luo,Kyoobj2.showArray();//Koji,Luo,Kyo以上代码通过obj1向obj1的属性array添加元素的时候,obj2的arra属性的元素也跟着受到影响,原因就在于obj1和obj2对象的array属性引用的是同一个Array对象,那么改变这个Array对象,另一引用该Array对象的属性自然也会受到影响混合的构造函数/原型方式。

使用构造函数定义对象的属性,使用原型(prototype)定义对象的方法,这样就可以做到属性私有,而方法共享。

例子:复制代码代码示例:functionPerson(name,age){=name;=age;this.array=newArray("Koji","Luo");}Person.prototype.showName=function(){alert();}Person.prototype.showArray=function(){alert(this.array);}varobj1=newPerson("Koji",22);//生成一个Person对象varobj2=newPerson("Luo",21);("Kyo");//向obj1的array属性添加一个元素obj1.showArray();//Koji,Luo,Kyoobj1.showName();//Kojiobj2.showArray();//Koji,Luoobj2.showName();//Luo属性私有后,改变各自的属性不会影响别的对象。

同时,方法也是由各个对象共享。在语义上,这符合了面相对象编程的要求。

4、动态原型方法复制代码代码示例:functionPerson(name,age){=name;=age;this.array=newArray("Koji","Luo");//如果Person对象中的_initialized为undefined,表明还没有为Person的原型添加方法if(typeofPerson._initialized=="undefined"){Person.prototype.showName=function(){alert();}Person.prototype.showArray=function(){alert(this.array);}Person._initialized=true;//设置为true,不必再为prototype添加方法}}varobj1=newPerson("Koji",22);//生成一个Person对象varobj2=newPerson("Luo",21);("Kyo");//向obj1的array属性添加一个元素obj1.showArray();//Koji,Luo,Kyoobj1.showName();//Kojiobj2.showArray();//Koji,Luoobj2.showName();//Luo这种方法和构造函数/原型方式大同小异。

只是将方法的添加放到了构造函数之中,同时在构造函数Person上添加了一个属性用来保证if语句只能成功执行一次。在实际应用中采用最广泛的是构造函数/原型方法。

动态原型方法也很流行,它在功能上和构造函数/原型方法是等价的,不要单独使用构造函数或原型方法。

js中严格模式下创建对象构造函数

varperson1=createPerson("Nicholas",29,"softwareEngineer");varperson1=newPerson("Nicholas",29,"softwareEngineer");区别在这两句话中,你可以看到第一个语句里面没有new关键字,直接执行一个函数;而第二个表达式中有new,也就是说是新实例化了一个对象。

JS中关于this的定义是:函数直接在全局中执行,那么this指向的是全局对象window。

也就是说你在createPerson中new了一个o,但是你再执行=name那么就等于是执行了=name,o对象本身不会有任何印象,最后你return了o也只是得到了一个空对象。

而JS中执行了new之后,等于通过构造函数创建了一个新对象,那么这个构造函数中的this也就指向了这个新实例化的对象,此时=name修改了新对象person1中的name值。

关于对象实例化的知识和this指向的问题题主还多翻一翻博客园的文章,讲的很详细,从长久发展来看先打好基础对你以后的道路更有好处。

Js new一个函数和直接调用函数的区别

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值