在javascript中,prototype是函数的一个固有属性,其他对象,比如字符串什么的,并没有这个属性。

这个属性做什么用呢?

1、用于该函数的所有实例进行共享

比如,共同的属性,共同的方法。类似C#里的静态全局变量。所有实例,是指通过new的方法,来进行构造该函数的实例对象。比如说

var Person = function(name) {
this.name = name;
}; var z3 = new Person("z3"); var l4 = new Person("l4");

z3、l4都是Person的实例。

那么这个时候或者在new之前,往Person的prototype添加属性,方法,两个实例z3、l4都能访问:

var Person = function(name) {
this.name = name;
}; var z3 = new Person("z3"); var l4 = new Person("l4"); Person.prototype.sayHi = function(hi) {
console.log(this.name + ":" + hi);
}; z3.sayHi("Hello World!");
l4.sayHi("Hello World!");

所以说,“prototype 属性使您有能力向对象添加属性和方法。”

2、public方法

也是由于这个特性,对于一个javascript的“类”(其实是函数了)来说,添加在prototype的方法是public方法,而内部的方法,则是private的。

var Person = function(name) {
this.name = name; Person.prototype.sayHi = function(hi) {//外部可以访问
console.log(this.name + ":" + hi);
};
this.sayHi2 = function(hi){//外部可以访问
console.log(this.name + ":" + hi);
}
var _sayHi = function(hi){//外部不能访问
console.log(hi);
}
}; var z3 = new Person("z3"); z3.sayHi("Hello World!");//OK
z3.sayHi2("hehehehe");//OK
z3._sayHi("hahahaha");//报错

3、继承

[javascript] view plaincopy
  1. var Father, Son, father, son;
  2. Father = (function() {
  3. function father(name) {//相当于构造函数了。这个构造函数很重要,下面的添加成员函数,属性,都靠它。
  4. this.name = name;
  5. }
  6. father.prototype.sayHi = function(hi) {
  7. return console.log(this.name + " : " + hi);
  8. };
  9. return father;
  10. })();
  11. Son = (function() {
  12. function Son(name) {
  13. this.name = name;
  14. }
  15. Son.prototype = new Father();//继承的诀窍在于此
  16. Son.prototype.cry = function(){ console.log("噢噢噢");}//子类扩展
  17. return Son;
  18. })();
  19. son = new Son("leftfist");
  20. son.sayHi("Hello World!");
  21. son.cry();

有关这个prototype的来历,阮一峰的博文有详细介绍,从中可以理解为什么会有这个东西。主要是因为当初设计者不想将javascript设计得那么复杂,搞成一个面向对象那么正式的语言,但又要照顾对象的继承等属性,因此提供了这么一个东东。

http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html

javascript里的prototype的更多相关文章

  1. 悟透Javascript之 原型prototype

    构造函数的Prototype上定义的方法确实可以通过对象直接调用,而且代码是共享的.我表示我不懂.太难理解了,艹.在Javascript中,prototype不但能让对象共享自己的财富,而且proto ...

  2. JavaScript里的依赖注入

    JavaScript里的依赖注入 我喜欢引用这句话,“程序是对复杂性的管理”.计算机世界是一个巨大的抽象建筑群.我们简单的包装一些东西然后发布新工具,周而复始.现在思考下,你所使用的语言包括的一些内建 ...

  3. JavaScript 里,$ 代表什么?/JQuery是什么语言?/html中用link标签引入css时的中 rel="stylesheet"属性?/EL表达式是什么?

    JavaScript 里,$ 代表什么? 比如说我写一个mouseover事件: $(document).ready(function(){ $("p").mouseover(fu ...

  4. JavaScript里的循环方法总结

    JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.length; index++) ...

  5. C# -- 等待异步操作执行完成的方式 C# -- 使用委托 delegate 执行异步操作 JavaScript -- 原型:prototype的使用 DBHelper类连接数据库 MVC View中获取action、controller、area名称、参数

    C# -- 等待异步操作执行完成的方式 C# -- 等待异步操作执行完成的方式 1. 等待异步操作的完成,代码实现: class Program { static void Main(string[] ...

  6. JavaScript里的循环方法之forEach,for-in,for-of

    JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...

  7. JavaScript里的循环方法:forEach,for-in,for-of

    JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.length; index++) ...

  8. JavaScript中Object.prototype.toString方法的原理

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.lo ...

  9. 谈谈javascript中的prototype与继承

    谈谈javascript中的prototype与继承 今天想谈谈javascript中的prototype. 通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性 ...

随机推荐

  1. Mysql读写分离与主从数据库设置方案

    Mysql读写分离与主从数据库设置方案 亿仁网 18-10-0711:31 Mysql无非四个功能:增,删,改,读.而将增删改和读分离操作.这样有利于提高系统性能.下面是非常直观的操作: 1.配置: ...

  2. No-4.变量的基本使用

    变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量  ...

  3. RabbitMQ之六种队列模式

    先学习一下RabbitMQ中的六种队列,只学习前五种,具体的官方文档地址是:http://next.rabbitmq.com/getstarted.html 导入maven依赖: <depend ...

  4. js判断图片是否有效

    var ImgObj=new Image(); ImgObj.src= 'http://192.168.10.6:8082/3D/SERVER_1_DELL_880.jpg'; if(ImgObj.f ...

  5. 零基础入门学习Python(32)--异常处理:你不可能总是对的

    知识点 即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误.运行期检测到的错误被称为异常. 大多数的异常都不会被程序处理,都以错误信息的形式展现在这里: Python标准异常总结 序 ...

  6. Reparameterization Trick

    目录 Sample() is not differentiable Reparameterization trick Too Complex Sample() is not differentiabl ...

  7. vue-router 根据路由动态添加目录 控制目录权限

    <template> <el-row class="el-menu" > <el-menu router :default-active='$rout ...

  8. layer弹层content写错导致div复制了一次,导致id失效 $().val() 获取不到dispaly:none div里表单的值

    ​ 错误之源: $("a.consult").click(function () {         lib_consult_html = $('#consult-html').h ...

  9. 在linux服务器上搭建Struts2项目运行环境

    服务器上工作: 首先要先装java https://www.cnblogs.com/lamp01/p/8932740.html 然后装好tomcat https://www.cnblogs.com/y ...

  10. 7-16 一元多项式求导(20 分)(有关while(scanf("%d",&n)!=EOF))

    7-16 一元多项式求导(20 分) 设计函数求一元多项式的导数. 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 以与输入相同 ...