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来调用的。








  • 相关阅读:
    Logstash配置文件介绍
    ElasticSearch搜索介绍四
    ElasticSearch文档操作介绍三
    ElasticSearch集群介绍二
    ElasticSearch入门介绍一
    Curl中的参数知多少
    sed命令使用介绍(转载)
    实例方法、类方法、静态方法
    函数概述,参数,可变参数,关键字参数,组合参数,递归函数
    startswith()函数与endswith()函数判断文件的开头和结尾
  • 原文地址:https://www.cnblogs.com/chayangge/p/4288698.html
Copyright © 2011-2022 走看看