Javascript学习之prototype

Javascript是一种基于原型的语言,和我们通常的Class based programming有很大的区别:

    1. 函数式first class object,也就是说函数与对象具有相同的语言地位

    2. 没有类,一切基于对象

    3. 函数也是一种对象,所谓的函数对象

    4. 对象是按引用来传递的

每个韩式都有一个prototype属性,这个属性指向一个对象的引用,这个对象成为原型对象,源性对象包含函数实例共享的方法和属性,也就是说讲函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和方法。

先来弄清一个概念:

私有变量,函数

JavaScript的作用域链,通俗讲就是函数内定义的变量和函数如果不对外提供接口,那么外部将无法访问到,就成为了私有变量和私有函数。

代码如下:

function Obj(){

    var a = 0;  //私有变量

    var fn = function(){     }  //私有函数

}

这样的函数对象Obj外部无法访问变量a和函数fn,他们变成私有的,只能在Obj内部使用,即使是函数Obj的实例仍然无法访问这些变量和函数。

静态变量、函数

当定义一个函数后通过 “.”为其添加的属性和函数,通过对象本身仍然可以访问得到,但是其实例却访问不到,这样的变量和函数分别被称为静态变量和静态函数,用过Java、C#的同学很好理解静态的含义。

复制代码代码如下:

function Obj(){

            }

            Obj.a=0; //静态变量

            Obj.fn=function(){ //静态函数

            }

            console.log(Obj.a); //0
            console.log(typeof Obj.fn); //function

            var o=new Obj();
            console.log(o.a); //undefined
            console.log(typeof o.fn); //undefined

实例变量、函数

在面向对象编程中除了一些库函数我们还是希望在对象定义的时候同时定义一些属性和方法,实例化后可以访问,JavaScript也能做到这样


function Obj(){
                this.a=[]; //实例变量
                this.fn=function(){ //实例方法

                }
            }

            console.log(typeof Obj.a); //undefined
            console.log(typeof Obj.fn); //undefined

            var o=new Obj();
            console.log(typeof o.a); //object
            console.log(typeof o.fn); //function

新的实例会有新的引用

function Obj(){
                this.a=[]; //实例变量
                this.fn=function(){ //实例方法

                }
            }

            var o1=new Obj();
            o1.a.push(1);
            o1.fn={};
            console.log(o1.a); //[1]
            console.log(typeof o1.fn); //object
            var o2=new Obj();
            console.log(o2.a); //[]
            console.log(typeof o2.fn); //function

上面的代码运行结果完全符合预期,但同时也说明一个问题,在o1中修改了a和fn,而在o2中没有改变,由于数组和函数都是对象,是引用类型,这就说明o1中的属性和方法与o2中的属性与方法虽然同名但却不是一个引用,而是对Obj对象定义的属性和方法的一个复制。

这个对属性来说没有什么问题,但是对于方法来说问题就很大了,因为方法都是在做完全一样的功能,但是却又两份复制,如果一个函数对象有上千和实例方法,那么它的每个实例都要保持一份上千个方法的复制,这显然是不科学的,这可肿么办呢,prototype应运而生。


你可能感兴趣的:(Javascript学习之prototype)