node.js中看javascript的prototype

来源:互联网 发布:qt5编程入门pdf百度云 编辑:程序博客网 时间:2024/05/05 04:52

编写node.js的代码时常常写Comment.prototype.save=function(callback){....},这个的意义是是什么,这里总结一下!!

写了一个demo

//测试prototype的功能:下面程序的结果是:

var User = function (){
this.save=function(){
console.log('This is this.save');
}

};
User.save = function () {console.log('This is User.save')};
User.prototype.save = function () {
                        console.log('This is User.prototype.save')
                      };


var u = new User();
u.save(); //调用User.prototype.save()
delete u.save;  //删除this.save
delete User.save; //删除User.save
u.save();//调用的依然是User.prototype.save()

当有红色的部分没有绿色的部分时,输入的结果为以下:

//This is User.prototype.save
//This is User.prototype.save

红色的部分其实实现的是一个静态的方法,使用实例对象来调用的时候根本是找不到红色部分的定义方法。如果删掉所有的其他方法,调用处只剩下u.save会出现没有这个方法的错误!!注意这个User.save是定义在User对象的外部!!

绿色的部分是定义在User对象的内部,所以当有绿色部分的时候,结果为:

//This is this.save
//This is this.save

所以大致的优先级是:先查看类中有没有同名的方法,有的话调用此方法(也就是绿色的部分),如果没有找到,则继续找prototype方法,再没有,再往上走,一直插到Object的原型上。

prototype有什么作用呢?为什么不直接用类中定义的方法呢?原因是这样的:

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应运而生。

无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,默认情况下prototype属性会默认获得一个constructor(构造函数)属性,这个属性是一个指向prototype属性所在函数的指针,有些绕了啊,写代码、上图!

--@hxx prototype是一个对象(即函数)A的属性,此prototype内部有一个constructor属性,改构造函数指向这个对象A,上面的图可以清楚的看出这一点,_proto_是连接实例与类定义之间的重要节点,上面提到的问题,每个实例对象都是一个独立的内存(方法,属性都是复制一份的,那怎么共享呢??在java中应该是希望每个对象放在独立的堆中,js中属性可以独立,但是方法不需要独立这句话怎么理解)


http://www.cnblogs.com/dolphinX/p/3286177.html

0 0
原创粉丝点击