JS:原型
- function Box(){
- }
- //使用字面量的方式创建原型对象,这里{}就是对象,是Object, new Object相当于{}
- Box.prototype = {
- name:"lee",
- age:25,
- run:function(){
- return this.name + this.age + "运行中...";
- }
- }
- Box.prototype = {
- age:26
- }
- var box1 = new Box();
- var a = [8,9,5,4,6,1,2];
- alert(a.sort());
- alert(Array.prototype.sort);
- alert(String.prototype.substring);
2.引用类型本身使用原型,不推荐
- 给String 类型添加一个方法
- String.prototype.addstring = function(){
- return this + ",被添加了!";
- }
- var b = "SS";
- alert(b.addstring());
- 原型的特点,原型不能传参数,原型具有共享性,也是原型的缺点
- Box.prototype = {
- constructor:Box,
- name:'cc',
- age:100,
- family:['爸爸','妈妈','哥哥'],
- run:function(){
- return this.name + this.age + this.family;
- }
- };
- var box1 = new Box();
- alert(box1.run()); //返回“cc100 爸爸 妈妈 哥哥”
- box1.family.push('姐姐');//返回“cc100 爸爸 妈妈 哥哥 姐姐”
- alert(box1.run());
- var box2 = new Box(); //返回“cc100 爸爸 妈妈 哥哥 姐姐”
- alert(box2.run());
- //为了解决构造传参合共享问题,可以组合构造函数+原型模式:
- function Box(name,age){
- this.name = name;
- this.age = age;
- this.family = ["父亲","母亲", "妹妹"];
- };
- Box.prototype = {
- constructor:Box,
- run:function(){
- return this.name + this.age + this.family;
- }
- }
- var box3 = new Box();
- alert(box3.run("cc",25)); //cc25父亲母亲妹妹
- box3.family.push("哥哥");
- alert(box3.run("cc",25)); //cc25父亲母亲妹妹哥哥
- var box4 = new Box()
- alert(box4.run("ll",58)); //ll58父亲母亲妹妹
- 以上方式解决了传参和共享的问题
上面的书写方式(构造函数+原型)的写法觉得十分怪异,最好是把它们封装在一起。为了解决这个问题,可以使用动态原型模式:
- function Box(name,age){
- this.name = name;
- this.age = age;
- if (typeof this.run !='function') { //只在第一次调用时初始化
- Box.prototype.run= function() {
- return this.name + this.age + "正在运行中...";
- };
- };
- }
- var box5 = new Box("cc",88);
- alert(box5.run());
ps:使用动态原型模式,要注意一点,不可以再使用字面量的方式重写原型,因为会切断实例和新原型直接的联系。
JS:原型的更多相关文章
- JS原型链
JS作为发展了多年了对象语言,支持继承,和完全面向对象语言不同的是,JS依赖原型链来实现对象的继承. 首先JS的对象分两大类,函数对象和普通对象,每个对象均内置__proto__属性,在不人为赋值__ ...
- 深入分析JS原型链以及为什么不能在原型链上使用对象
在刚刚接触JS原型链的时候都会接触到一个熟悉的名词:prototype:如果你曾经深入过prototype,你会接触到另一个名词:__proto__(注意:两边各有两条下划线,不是一条).以下将会围绕 ...
- 【09-23】js原型继承学习笔记
js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...
- js原型
1.js基本类型和对象类型 js的简单类型包括数字(其中NaN为数字类型).字符串(类似'A'为字符,js没字符类型).布尔值.null值和undefined值.其他所有的值都是对象.数字.字符串和布 ...
- js原型链与继承(初体验)
js原型链与继承是js中的重点,所以我们通过以下三个例子来进行详细的讲解. 首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询 ...
- JS 原型链图形详解
JS原型链 这篇文章是「深入ECMA-262-3」系列的一个概览和摘要.每个部分都包含了对应章节的链接,所以你可以阅读它们以便对其有更深的理解. 对象 ECMAScript做为一个高度抽象的面向对象语 ...
- js原型解析
我们都知道javascript因为具有了继承以及变量等等一系列的特性之后才被人们认为具有一门编程语言的资格,在后续的不断发展中,js在原生的基础上扩展了基于jquery等等的库,甚至衍生了像node. ...
- 深入理解JS原型链与继承
我 觉得阅读精彩的文章是提升自己最快的方法,而且我发现人在不同阶段看待同样的东西都会有不同的收获,有一天你看到一本好书或者好的文章,请记得收藏起来, 隔断时间再去看看,我想应该会有很大的收获.其实今天 ...
- 学习zepto.js(原型方法)
学习zepto.js(原型方法)[1] 转载 新的一周,新的开始,今天来学习一下zepto里边的原型方法,就是通过$.进行调用的方法,也是可以通过$.fn进行扩展的方法: $.camelCase(): ...
- js原型链部分详细使用说明案例
1. 'index.html'文件 ```html <!DOCTYPE html> <html lang="en"> <head> <me ...
随机推荐
- 让ASP.NET MVC不使用jsonp也可以跨域访问
跨域问题仅仅发生在Javascript发起AJAX调用,或者Silverlight发起服务调用时,其根本原因是因为浏览器对于这两种请求,所给予的权限是较低的,通常只允许调用本域中的资源,除非目标服务器 ...
- ACM训练计划建议(写给本校acmer,欢迎围观和指正)
ACM训练计划建议 From:freecode# Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...
- scala的tcp通信
client: object ActorClient extends App { import actors.Actor, actors.remote.Node, actors.remote.Remo ...
- PHPCMS V9 WAP手机门户域名绑定
如需要绑定域名为wap.domain.com,作下如操作: 一.把wap.domain.com域名绑定到你的这个网站主机上. 二.在网站后台模块>手机门户域名里面填写“http://wap.do ...
- ereg/eregi报错处理办法
ereg()函数和eregi()函数用法相同,不同之处在与ereg()区分大小写,eregi()不区分大小写 在php5.3以上的版本将不再支持eregi()和ereg()函数 处理办法: 正则函数处 ...
- shell判断文件是否存在
转自:http://www.cnblogs.com/sunyubo/archive/2011/10/17/2282047.html 1. shell判断文件,目录是否存在或者具有权限 2. #!/bi ...
- C++ find 函数用法
头文件 #include <algorithm> 函数实现 template<class InputIterator, class T> InputIterator find ...
- Android ImageCache图片缓存,使用简单,支持预取,支持多种缓存算法,支持不同网络类型,扩展性强
本文主要介绍一个支持图片自动预取.支持多种缓存算法的图片缓存的使用及功能.图片较大需要SD卡保存情况推荐使用ImageSDCardCache. 与Android LruCache相比主要特性:(1). ...
- [Java] arraycopy 数组复制(转)
public class ArraycopyTest { public static void main(String[] args) { //静态初始化两个长度不同的 ...
- Loadrunner的自定义监控器
Loadrunner的自定义监控器 可以使用lr_user_data_point()来实现自定义监控,下面是一个小例子: double showsomething(); Action(){ doubl ...