javascript里的prototype
在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、继承
- var Father, Son, father, son;
- Father = (function() {
- function father(name) {//相当于构造函数了。这个构造函数很重要,下面的添加成员函数,属性,都靠它。
- this.name = name;
- }
- father.prototype.sayHi = function(hi) {
- return console.log(this.name + " : " + hi);
- };
- return father;
- })();
- Son = (function() {
- function Son(name) {
- this.name = name;
- }
- Son.prototype = new Father();//继承的诀窍在于此
- Son.prototype.cry = function(){ console.log("噢噢噢");}//子类扩展
- return Son;
- })();
- son = new Son("leftfist");
- son.sayHi("Hello World!");
- son.cry();
有关这个prototype的来历,阮一峰的博文有详细介绍,从中可以理解为什么会有这个东西。主要是因为当初设计者不想将javascript设计得那么复杂,搞成一个面向对象那么正式的语言,但又要照顾对象的继承等属性,因此提供了这么一个东东。
http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html
javascript里的prototype的更多相关文章
- 悟透Javascript之 原型prototype
构造函数的Prototype上定义的方法确实可以通过对象直接调用,而且代码是共享的.我表示我不懂.太难理解了,艹.在Javascript中,prototype不但能让对象共享自己的财富,而且proto ...
- JavaScript里的依赖注入
JavaScript里的依赖注入 我喜欢引用这句话,“程序是对复杂性的管理”.计算机世界是一个巨大的抽象建筑群.我们简单的包装一些东西然后发布新工具,周而复始.现在思考下,你所使用的语言包括的一些内建 ...
- JavaScript 里,$ 代表什么?/JQuery是什么语言?/html中用link标签引入css时的中 rel="stylesheet"属性?/EL表达式是什么?
JavaScript 里,$ 代表什么? 比如说我写一个mouseover事件: $(document).ready(function(){ $("p").mouseover(fu ...
- JavaScript里的循环方法总结
JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.length; index++) ...
- C# -- 等待异步操作执行完成的方式 C# -- 使用委托 delegate 执行异步操作 JavaScript -- 原型:prototype的使用 DBHelper类连接数据库 MVC View中获取action、controller、area名称、参数
C# -- 等待异步操作执行完成的方式 C# -- 等待异步操作执行完成的方式 1. 等待异步操作的完成,代码实现: class Program { static void Main(string[] ...
- JavaScript里的循环方法之forEach,for-in,for-of
JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标 ...
- JavaScript里的循环方法:forEach,for-in,for-of
JavaScript诞生已经有20多年了,我们一直使用的用来循环一个数组的方法是这样的: for (var index = 0; index < myArray.length; index++) ...
- JavaScript中Object.prototype.toString方法的原理
在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.lo ...
- 谈谈javascript中的prototype与继承
谈谈javascript中的prototype与继承 今天想谈谈javascript中的prototype. 通常来说,javascript中的对象就是一个指向prototype的指针和一个自身的属性 ...
随机推荐
- Mysql读写分离与主从数据库设置方案
Mysql读写分离与主从数据库设置方案 亿仁网 18-10-0711:31 Mysql无非四个功能:增,删,改,读.而将增删改和读分离操作.这样有利于提高系统性能.下面是非常直观的操作: 1.配置: ...
- No-4.变量的基本使用
变量的基本使用 程序就是用来处理数据的,而变量就是用来存储数据的 目标 变量定义 变量的类型 变量的命名 01. 变量定义 在 Python 中,每个变量 在使用前都必须赋值,变量 赋值以后 该变量 ...
- RabbitMQ之六种队列模式
先学习一下RabbitMQ中的六种队列,只学习前五种,具体的官方文档地址是:http://next.rabbitmq.com/getstarted.html 导入maven依赖: <depend ...
- js判断图片是否有效
var ImgObj=new Image(); ImgObj.src= 'http://192.168.10.6:8082/3D/SERVER_1_DELL_880.jpg'; if(ImgObj.f ...
- 零基础入门学习Python(32)--异常处理:你不可能总是对的
知识点 即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误.运行期检测到的错误被称为异常. 大多数的异常都不会被程序处理,都以错误信息的形式展现在这里: Python标准异常总结 序 ...
- Reparameterization Trick
目录 Sample() is not differentiable Reparameterization trick Too Complex Sample() is not differentiabl ...
- vue-router 根据路由动态添加目录 控制目录权限
<template> <el-row class="el-menu" > <el-menu router :default-active='$rout ...
- layer弹层content写错导致div复制了一次,导致id失效 $().val() 获取不到dispaly:none div里表单的值
错误之源: $("a.consult").click(function () { lib_consult_html = $('#consult-html').h ...
- 在linux服务器上搭建Struts2项目运行环境
服务器上工作: 首先要先装java https://www.cnblogs.com/lamp01/p/8932740.html 然后装好tomcat https://www.cnblogs.com/y ...
- 7-16 一元多项式求导(20 分)(有关while(scanf("%d",&n)!=EOF))
7-16 一元多项式求导(20 分) 设计函数求一元多项式的导数. 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 以与输入相同 ...