zoukankan      html  css  js  c++  java
  • 用构造函数创建对象时的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来调用的。








  • 相关阅读:
    Web Api:基于RESTful标准
    C#:导入Excel通用类(Xls格式)
    C#:导入Excel通用类(Xlsx格式)
    Selenium---Python3---下拉框选择处理
    Selenium---Python3---弹框处理
    Selenium---设置等待时间
    Selenium---Python3--获取网页url/获取网页title
    Selenium---键盘事件---Python3
    Selenium---鼠标事件---Python3
    Selenium---Python3---常见方法
  • 原文地址:https://www.cnblogs.com/chayangge/p/4288698.html
Copyright © 2011-2022 走看看