• 用构造函数创建对象时的this的指向问题


    用构造函数方式创建对象:

    function Person(name,age){
    			this.name=name;
    			this.age=age;
    			this.sayname=function(){
    				alert(this.name);
    			};
    		}
    构造函数其实就是用new操作符调用的一个函数。用new时构造函数内部的this会指向新的实例,如:

    var p1=new Person('tom',10);
    此过程中this指向p1,相当于:

    p1.name=name;//name为参数tom
    p1.age=age;//age为参数10

    检测结果:

    alert(p1.name);  //tom
    p1.sayname();<span style="white-space:pre">	</span>//tom

    上述在this的帮助下实现p1的属性。

    那么倘若不用new呢?直接把构造函数当作一个普通函数来直接调用又会有什么情况:

    var p2=Person('tom',10); //直接调用(不适用new)
    检测结果:

    alert(p2.name);//(报错)name is undefined 
    p2.sayname();  //(报错)sayname is undefined
    用以下代码则能正常运行:

    alert(name)//tom
    sayname();//tom
    很明显此时的name和sayname已经不属于p2,而是属于全局window,等同于:

    alert(window.name);
    window.sayname();
    很明显不用new,而采用直接调用的方式this不在代表新的实例p2,而是window,this把name和sayname全放到了全局window中。

    为了确保每次实例化时都能用new,用构造函数创建对象的方式可改进为:

    <span style="white-space:pre">		</span>function Person(name,age){
    			if(this instanceof Person)//先判断this对象是否为Person的实例
    			{
    			this.name=name;
    			this.age=age;
    			this.sayname=function(){
    				alert(this.name);
    				};
    			}
    			else
    			{
    				return new Person(name,age);//否则用new操作符(调用构造函数)创建新的实例并返回,结果还是使用了new
    			}
    			
    		}

    这样无论是否用new调用构造函数,其结果都是用new来调用的。








  • 相关阅读:
    采用NAND Flash启动时出现Kernel panic not syncing: No init found错误
    ubuntu 11.10 安装小企鹅fcitx输入法
    UBoot中设定的bootdelay参数不起作用
    python 数据类型
    python运算符
    python符号//、%和/运算
    pytho 基本数据类型
    Python 开篇
    mmsplayer v2 java 之(mmsPlayer 播放类)
    mmsplayer v2 java 之(mmsTrack 音频类)
  • 原文地址:https://www.cnblogs.com/chayangge/p/4288698.html
Copyright © 2020-2023  润新知