刚刚接触JavaScript不久,一开始认为它不过是个简单的脚本语言而已,但是在平常或多或少的接触中,对于this指针、全局和局部变量等理解的都不深刻,所以找了些资料看看。
3、函数对象
2)认识函数对象
3)函数对象和其他内部对象的关系
函数:
区别:
new一个Function实际上返回的是一个函数,这与其他对象有很大的不同。尽管函数本身也是一个对象,但它与普通的对象还是很有区别的,因为它同时也是一个对象构造器,也就是说,可以new一个函数来返回一个对象。所有typeof返回“function”的对象都是函数对象,也称这样的对象为构造器(constructor)。因而,所有的构造器都是对象,但不是所有的对象都是构造器。Function是所有函数对象的基础,而Object是所有对象(包括函数对象)的基础。
这里的this关键字是不能省略的,即不能写成alert(p)的形式,这将使得getP函数去引用上下文环境中的p变量,而不是obj1的属性。
一、类 和实例(对象)
1、类的创建
- function class1(){
- //类成员的定义及构造函数
- }
这里class1既是一个函数也是一个类。可以将它理解为类的构造函数,负责初始化工作。
2、实例的创建
1)用 obj1=new class1();来获得obj1对象。
2)用{ }来创建无类型对象 。
- var obj={}; //定义了一个空对象 ,等价于var obj= new Object();
- var user={
- name:"jack",
- favoriteColor:["red","green"],
- hello:function(){ //定义了hello方法 。
- alert("hello,"+this.name)
- }
- }
- user.hello(); //调用user对象的方法hello
3、函数对象
1)函数的使用方法
- function func1(...){...};
- var func2=function(...){...};
- var func3=function func4(...){...};
- var func5=new Function();
可以用function关键字定义一个函数,并为每个函数指定一个函数名,通过函数名进行调用。在JavaScript解释执行时,函数都是被维护为一个对象,就是函数对象(Function Object)。
下面两段代码都是创建一个函数myFunction:
- function myFunction(a,b){
- return a+b;
- }
- //等价于
- var myFunction =new Function("a","b","return a+b");
3)函数对象和其他内部对象的关系
内部对象:
- alert(typeof(Array)); //function,表示一个类。
- alert(typeof(Object)); //function
- alert(typeof(Date)); //function
- alert(typeof(new Array())); //object,返回一个对象。
- alert(typeof(new Object())); //object
- alert(typeof(new Date())); //object
- alert(typeof(Function)); //function
- alert(typeof(foo)); //function
- alert(typeof(foo())); //object
- alert(typeof(new Function())); //function
4.深入认识this指针
JavaScript中的this指针式一个动态变化的变量,它表明了当前运行该函数的对象。一个对象就是由一个或多个属性(方法)组合成的集合。每个集合元素不是仅能属于一个集合,而是可以动态属于多个集合。这样,一个方法(集合元素)由谁调用,this指针就指向谁。
由于对象属性(方法)的动态变化特性,一个对象的两个属性(方法)之间的相互引用,必须通过this指针。
- var namespace1=new Object();
- namespace1.class1=function(){
- //初始化对象的代码
- }
- var obj1=new namespace1.class1();
- obj1.getP=function(){
- alert(this.p); //表面上this指针指向的是object1
- }
5、类的实现机制
- // 构造函数
- function Person(name, sex) {
- this.name = name;
- this.sex = sex;
- }
- // 定义Person的原型,原型中的属性可以被自定义对象引用 。
- Person.prototype = {
- getName: function() {
- return this.name;
- },
- getSex: function() {
- return this.sex;
- }
- }
当代码var zhang = new Person("ZhangSan", "man")执行时,其实内部做了如下几件事情:
- 创建一个空白对象(new Object())。
- 拷贝Person.prototype中的属性(键值对)到这个空对象中(我们前面提到,内部实现时不是拷贝而是一个隐藏的链接)。
- 将这个对象通过this关键字传递到构造函数中并执行构造函数。
- 将这个对象赋值给变量zhang。