扫码关注官方订阅号
PHP中文网 认证0级讲师 全部回复(4) 我来回复 巴扎黑2017-04-11 11:36:40 4楼 构造函数是个函数,this指向的是个对象,this蒙上眼睛指也指不到构造函数去.构造函数的this指向创建的实例对象无疑. 要明白这一点,要先弄明白,用new操作符调用构造函数的时候都发生了什么.正好我有个答案是讲构造函数的, 我这里原样搬来: 造函数其实和普通函数本质上并无区别,唯一的区别有两个: 函数首字母大写,这个区别只是约定俗成的,便于区分。你实在要小写定义构造函数也完全没问题,所以这个区别可以忽略。构造函数的调用需要用new操作符,而普通函数的调用又分很多种,但是都不会用到new操作符。所以,构造函数和普通函数的区别就在这个new操作符里,现在让我们来好好研究一下这个new操作符。用new操作符创建对象时发生的事情:**第一步: 创建一个Object对象实例。第二步: 将构造函数的执行对象赋给新生成的这个实例。第三步: 执行构造函数中的代码第四步: 返回新生成的对象实例** 注意:原本的构造函数是window对象的方法,如果不用new操作符而直接调用,那么构造函数的执行对象就 是window,即this指向了window。现在用new操作符后,this就指向了新生成的对象。理解这一步至关重要。执行构造函数中的代码,看代码: function Person(){ this.name = "Tiny Colder"; var age = 22; window.age = 22; } var p = new Person(); alert(p.name)//Tiny Colder; alert(p.age)//undefined; alert(window.age)//22; 当用new操作符创建对象时,先创建了一个对象实例,然后执行代码。所以还在纠结,什么时候构造函数定义的属性会继承给实例对象的,都可以这么来看: var p = new Object(); p.name = "Tiny Colder"; 这是普通的创建对象,然后给对象添加属性的方法。如果每创建一个对象,都需要这么几行代码,无疑是糟糕的。这个需求就正好跟这一点对应:new操作符,自动执行构造函数里的代码。如此我们便可以省掉添加属性时重复冗余的代码。那么这些属性时如何添加到新生成的对象里的呢? 第二个步骤里已经说了:将构造函数的执行对象赋给新生成的这个实例。再结合上一段里说的,自动执行构造函数里的this.name = "Tiny Colder";时,就相当于是执行p.name = "Tiny Colder";而构造函数里的var age = 22;语句,会执行但是对新生成的对象并无影响。window.age = 22;语句,会执行,且会给window对象添加一个属性。alert为证。 或许到这里,你已经理解了new操作符的前三步了,重要的三步。但是这个函数是如何返回对象的呢?我们并没有看到有任何跟return相关的语句。这就是new操作符的最后一步:返回新生成的对象。如果被调用的函数没有显式的 return 表达式(仅限于返回对象),则隐式的会返回 this 对象 - 也就是新创建的对象。 现在来看一下这个代码: function Person(){ this.name = "Tiny Colder"; return {}; } var p = new Person(); alert(p.name)//undefined; 一个对象就这么被创建出来了。实际上, 全选复制放进笔记 var p = new Person(); 和 var p = new Object(); Person.apply(p); 是一样的效果。 赞 +0 添加回复 PHP中文网 回复 黄舟2017-04-11 11:36:40 3楼 首先,题主的代码里this根据出现的地方可以分为两类:1.this.aa = 6666; 2.return中的this 接下来先说结论:第一种情况的中this.aa指向sdf,return中this指向全局对象window;第二种情况中两次this都指向window;下面是具体分析: 当执行 `var sdf=new test(); sdf();` 时,this.aa = 6666;中this指向的是调用对象test函数的sdf,但是因为题主return了一个函数,所以这一步执行的结果导致了sdf成为了一个函数对象,(如果此时console.log(sdf.aa)是没有结果的,因为函数对象没有自定义属性,如果删除return function再console.log(sdf.aa)就会发现打印出的是6666,足以证明) 接下来sdf()调用,此时this对象是全局对象window,所以打印的结果分别是456(函数作用域优先查找最内层的值) undefined 123;当执行test()()是,相当于两次传入的this都是window对象,所以打印的结果分别是 456(理由同上) 6666 123 赞 +0 添加回复 PHP中文网 回复 高洛峰2017-04-11 11:36:40 2楼 sdf()里的this指向了全局对象;由于全局对象中aaa没有创建,所以显示undefined。 赞 +0 添加回复 PHP中文网 回复 怪我咯2017-04-11 11:36:40 1楼 1、如果你的test是一个正常的js类(构造函数里面没有return)时,this是指向new test()生成的对象.2、你写的构造函数里面有return, 返回的是一个函数,相当于将对象的引用废弃掉了。再调用的时候this指向的window全局。 console.log(this.aa);console.log(this.xuuu); 这两条语句的返回结果的原因是一样的 赞 +0 添加回复 PHP中文网 回复
认证0级讲师
构造函数是个函数,this指向的是个对象,this蒙上眼睛指也指不到构造函数去.构造函数的this指向创建的实例对象无疑. 要明白这一点,要先弄明白,用new操作符调用构造函数的时候都发生了什么.正好我有个答案是讲构造函数的, 我这里原样搬来:
造函数其实和普通函数本质上并无区别,唯一的区别有两个:
函数首字母大写,这个区别只是约定俗成的,便于区分。你实在要小写定义构造函数也完全没问题,所以这个区别可以忽略。构造函数的调用需要用new操作符,而普通函数的调用又分很多种,但是都不会用到new操作符。所以,构造函数和普通函数的区别就在这个new操作符里,现在让我们来好好研究一下这个new操作符。用new操作符创建对象时发生的事情:**第一步: 创建一个Object对象实例。第二步: 将构造函数的执行对象赋给新生成的这个实例。第三步: 执行构造函数中的代码第四步: 返回新生成的对象实例**
注意:原本的构造函数是window对象的方法,如果不用new操作符而直接调用,那么构造函数的执行对象就 是window,即this指向了window。现在用new操作符后,this就指向了新生成的对象。理解这一步至关重要。执行构造函数中的代码,看代码:
function Person(){
this.name = "Tiny Colder"; var age = 22; window.age = 22; } var p = new Person(); alert(p.name)//Tiny Colder; alert(p.age)//undefined; alert(window.age)//22;
当用new操作符创建对象时,先创建了一个对象实例,然后执行代码。所以还在纠结,什么时候构造函数定义的属性会继承给实例对象的,都可以这么来看:
var p = new Object(); p.name = "Tiny Colder";
这是普通的创建对象,然后给对象添加属性的方法。如果每创建一个对象,都需要这么几行代码,无疑是糟糕的。这个需求就正好跟这一点对应:new操作符,自动执行构造函数里的代码。如此我们便可以省掉添加属性时重复冗余的代码。那么这些属性时如何添加到新生成的对象里的呢?
第二个步骤里已经说了:将构造函数的执行对象赋给新生成的这个实例。再结合上一段里说的,自动执行构造函数里的this.name = "Tiny Colder";时,就相当于是执行p.name = "Tiny Colder";而构造函数里的var age = 22;语句,会执行但是对新生成的对象并无影响。window.age = 22;语句,会执行,且会给window对象添加一个属性。alert为证。
或许到这里,你已经理解了new操作符的前三步了,重要的三步。但是这个函数是如何返回对象的呢?我们并没有看到有任何跟return相关的语句。这就是new操作符的最后一步:返回新生成的对象。如果被调用的函数没有显式的 return 表达式(仅限于返回对象),则隐式的会返回 this 对象 - 也就是新创建的对象。
现在来看一下这个代码:
function Person(){ this.name = "Tiny Colder"; return {}; } var p = new Person(); alert(p.name)//undefined;
一个对象就这么被创建出来了。实际上,
全选复制放进笔记 var p = new Person();
和 var p = new Object(); Person.apply(p);
是一样的效果。
首先,题主的代码里this根据出现的地方可以分为两类:1.this.aa = 6666; 2.return中的this
this.aa = 6666;
接下来先说结论:第一种情况的中this.aa指向sdf,return中this指向全局对象window;第二种情况中两次this都指向window;下面是具体分析: 当执行
`var sdf=new test(); sdf();`
时,this.aa = 6666;中this指向的是调用对象test函数的sdf,但是因为题主return了一个函数,所以这一步执行的结果导致了sdf成为了一个函数对象,(如果此时console.log(sdf.aa)是没有结果的,因为函数对象没有自定义属性,如果删除return function再console.log(sdf.aa)就会发现打印出的是6666,足以证明)
接下来sdf()调用,此时this对象是全局对象window,所以打印的结果分别是456(函数作用域优先查找最内层的值) undefined 123;当执行test()()是,相当于两次传入的this都是window对象,所以打印的结果分别是 456(理由同上) 6666 123
sdf()里的this指向了全局对象;由于全局对象中aaa没有创建,所以显示undefined。
1、如果你的test是一个正常的js类(构造函数里面没有return)时,this是指向new test()生成的对象.2、你写的构造函数里面有return, 返回的是一个函数,相当于将对象的引用废弃掉了。再调用的时候this指向的window全局。
console.log(this.aa);console.log(this.xuuu); 这两条语句的返回结果的原因是一样的
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
构造函数是个函数,this指向的是个对象,this蒙上眼睛指也指不到构造函数去.
构造函数的this指向创建的实例对象无疑. 要明白这一点,要先弄明白,用new操作符调用构造函数的时候都发生了什么.
正好我有个答案是讲构造函数的, 我这里原样搬来:
造函数其实和普通函数本质上并无区别,唯一的区别有两个:
函数首字母大写,这个区别只是约定俗成的,便于区分。你实在要小写定义构造函数也完全没问题,所以这个区别可以忽略。
构造函数的调用需要用new操作符,而普通函数的调用又分很多种,但是都不会用到new操作符。所以,构造函数和普通函数的区别就在这个new操作符里,现在让我们来好好研究一下这个new操作符。
用new操作符创建对象时发生的事情:
**第一步: 创建一个Object对象实例。
第二步: 将构造函数的执行对象赋给新生成的这个实例。
第三步: 执行构造函数中的代码
第四步: 返回新生成的对象实例**
注意:原本的构造函数是window对象的方法,如果不用new操作符而直接调用,那么构造函数的执行对象就 是window,即this指向了window。现在用new操作符后,this就指向了新生成的对象。理解这一步至关重要。
执行构造函数中的代码,看代码:
function Person(){
当用new操作符创建对象时,先创建了一个对象实例,然后执行代码。所以还在纠结,什么时候构造函数定义的属性会继承给实例对象的,都可以这么来看:
这是普通的创建对象,然后给对象添加属性的方法。如果每创建一个对象,都需要这么几行代码,无疑是糟糕的。这个需求就正好跟这一点对应:new操作符,自动执行构造函数里的代码。如此我们便可以省掉添加属性时重复冗余的代码。那么这些属性时如何添加到新生成的对象里的呢?
第二个步骤里已经说了:将构造函数的执行对象赋给新生成的这个实例。再结合上一段里说的,自动执行构造函数里的this.name = "Tiny Colder";时,就相当于是执行p.name = "Tiny Colder";而构造函数里的
var age = 22;语句,会执行但是对新生成的对象并无影响。window.age = 22;语句,会执行,且会给window对象添加一个属性。alert为证。
或许到这里,你已经理解了new操作符的前三步了,重要的三步。但是这个函数是如何返回对象的呢?我们并没有看到有任何跟return相关的语句。这就是new操作符的最后一步:返回新生成的对象。
如果被调用的函数没有显式的 return 表达式(仅限于返回对象),则隐式的会返回 this 对象 - 也就是新创建的对象。
现在来看一下这个代码:
一个对象就这么被创建出来了。
实际上,
全选复制放进笔记 var p = new Person();
是一样的效果。
首先,题主的代码里this根据出现的地方可以分为两类:
1.
this.aa = 6666;2.return中的this
接下来先说结论:第一种情况的中this.aa指向sdf,return中this指向全局对象window;第二种情况中两次this都指向window;
下面是具体分析:
当执行
时,this.aa = 6666;中this指向的是调用对象test函数的sdf,但是因为题主return了一个函数,所以这一步执行的结果导致了sdf成为了一个函数对象,(如果此时console.log(sdf.aa)是没有结果的,因为函数对象没有自定义属性,如果删除return function再console.log(sdf.aa)就会发现打印出的是6666,足以证明)
接下来sdf()调用,此时this对象是全局对象window,所以打印的结果分别是456(函数作用域优先查找最内层的值) undefined 123;
当执行test()()是,相当于两次传入的this都是window对象,所以打印的结果分别是 456(理由同上) 6666 123
sdf()里的this指向了全局对象;由于全局对象中aaa没有创建,所以显示undefined。
1、如果你的test是一个正常的js类(构造函数里面没有return)时,this是指向new test()生成的对象.
2、你写的构造函数里面有return, 返回的是一个函数,相当于将对象的引用废弃掉了。再调用的时候this指向的window全局。
console.log(this.aa);
console.log(this.xuuu);
这两条语句的返回结果的原因是一样的