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
- node.js中看javascript的prototype
- 从vue-cli中看node.js和webpack的运作
- 服务器端的Javascript----Node.js
- Prototype.js--Javascript编写者的小军刀
- javascript-js 的prototype原型理解讲解
- javascript-js 的prototype原型理解讲解
- Node.js 服务器端的JavaScript脚本新秀:Node.js
- Node.js服务端的javascript脚本
- 【Node.js】 运行在服务端的 JavaScript
- javascript与node.js的区别
- JavaScript基础之Node.js的模块
- 【js】javascript中的原型prototype
- prototype.js 深入学习 javascript 的面向对象特性
- 从 prototype.js 深入学习 javascript 的面向对象特性
- 从 prototype.js 深入学习 javascript 的面向对象特性
- 使用Javascript和prototype.js框架创建类型及其相关的prototype属性的简单介绍
- JavaScript与Node.js
- JavaScript的Prototype使用
- WINDOWS下更改MYSQL数据路径(datadir)后服务启动1067解决不能改变mysql数据库存储位置
- 用例图的设计实例
- blob分析
- 神奇的C语言二十一:谈谈位运算
- 《How To Tomcat Works》-第五章 容器
- node.js中看javascript的prototype
- HTML中引入CSS的方法
- 用宏实现简单的多态 简单小技巧
- NSTimer知识点
- 折腾gcc/g++链接时.o文件及库的顺序问题
- alter table move跟shrink space的区别
- C++对象练习之-长方体(1)
- extjs中form表单提交成功、失败的响应信息
- ICE文集