js中 new,self和this的用法解释

一、对JS中new的理解

1.JavaScript 中new 的机制实际上和面向类的语言完全不同。

JavaScript 中的“构造函数”。在JavaScript 中,构造函数只是一些使用new 操作符时被调用的函数。它们并不会属于某个类,也不会实例化一个类。实际上,它们甚至都不能说是一种特殊的函数类型,它们只是被new 操作符调用的普通函数而已.

2.重要但是非常细微的区别:实际上并不存在所谓的“构造函数”,只有对于函数的“构造调用”。

使用new 来调用函数,或者说发生构造函数调用时,会自动执行下面的操作。
①创建(或者说构造)一个全新的对象。
② 这个新对象会被执行[[ 原型]] 连接。
③这个新对象会绑定到函数调用的this。
④ 如果函数没有返回其他对象,那么new 表达式中的函数调用会自动返回这个新对象。
例:

function foo(a)

{
       this.a = a;

}
var bar = new foo(2);
console.log( bar.a ); // 2

使用new 来调用foo(..) 时,我们会构造一个新对象并把它绑定到foo(..) 调用中的this上。

二、对JS中self、this的理解

每个函数在定义被ECMAScript解析器解析时,都会创建两个特殊的变量:this和arguments(每个函数都有属于自己的this对象)。

1.this的指向

this对象在运行时基于函数的执行环境进行绑定。例如,在全局对象中,this指向的是window对象;而在自定义函数中,this对象指向的是调用这个函数的对象。即this指向的是调用执行环境的那个对象(在函数嵌套环境中,this指代的是调用外部函数或者内部函数的执行环境的对象。在通过使用call()或者apply()改变函数执行环境时,this就会指向其他对象)。

2.self的指向

①在内部函数(例如本函数里面包含的两个匿名函数)搜索this变量时,只会搜索到属于它自己的this,而不会搜索到包含(调用)它的那个函数this,所以为了在内部函数能使用外部函数的this对象,要给它赋值一个名叫self的变量。

function BaseType(name,age){
            var self=this;
            this.name=name;
            this.age=age;
            this.sayHello=function (){
            console.log("My name is "+this.name+", and i'm "+this.age+"years old.");
            }
            this.saySomething=function(){
                self.sayHello();
            }
        }
        var b1=new BaseType("wede",30);
        b1.saySomething(); 

②实例成员和局部成员

实例成员调用方法(this定义,self调用):若在调用sayHello()时,去掉self,会报错

 function BaseType(name,age){
            var self=this;
            this.name=name;
            this.age=age;
            this.sayHello=function (){
            console.log("My name is "+this.name+", and i'm "+this.age+"years old.");
            }
            this.saySomething=function(){
                sayHello();
            }
        }
        var b1=new BaseType("wede",30);//ReferenceError: sayHello is not defined
        b1.saySomething(); 

局部成员调用方法(var定义,直接调用):sayHello方法变成了一个局部方法(对于实例不可见),然后再在saySomething方法中调用

 function BaseType(name,age){
            var self=this;
            this.name=name;
            this.age=age;
            var sayHello=function(){
            console.log("My name is "+this.name+", and i'm "+this.age+"years old.");
            }
            this.saySomething=function(){
                sayHello();
            }
        }
        var b1=new BaseType("wede",30);
        b1.saySomething(); 

创建构造函数的意义就是要用它来创建实例,因此所有属于实例的成员都需要用this来定义,只有那些不属于实例的成员才不会用this定义。

发布了38 篇原创文章 · 获赞 2 · 访问量 1531

猜你喜欢

转载自blog.csdn.net/qq_34754747/article/details/103830328