但是还有一个问题,就是识别的问题,因为根本无法搞清楚他们到底是哪个对象的实例。

1.构造函数

function CreateObject(name,age){  //创建一个对象,使用构造函数的对象都是Object
this.name=name; //添加一个属性
this.age=age;
this.run=function(){ //添加一个方法
return this.name+this.age+'运行中...'
}
} var box=new CreateObject('link',200); //实例化
var box1=new CreateObject('html',300);//实例化 alert(box.run());
alert(box1.run());

1.构造函数没有new Object,是因为后台自动var obj=new Object();
2.this就相当于obj。
3.构造函数不需要返回对象引用,它是后台自动返回的。

ps:

构造函数也是函数,函数名必须首字母大写,CreateObject(name,age)
必须new构造函数方法名,new CreateObject('link',200);
必须使用new运算符

2.原型

我们创建的每个函数都有一个Prototype(原型),这个属性是一个对象,它的用途就是包含可以由特定类型的所有实例共享的属性和方法。

可以理解成:prototype通过调用构造函数而创建的那个对象的原型对象。

使用原型的好处可以让所有对象实例共享它所包含的属性和方法,也就是说,不必在构造函数中定义对象信息,而是可以直接将这些信息添加到原型中。

function Box(){}  //构造函数函数体内什么都没有,这里如果有,也叫做实例函数,实例方法

		Box.prototype.name="link"; //原型属性
Box.prototype.age=25;
Box.prototype.run=function(){ //原型方法
return this.name+this.age+"运行中..."
}
var Box1=new Box();
var Box2=new Box();
alert(Box1.run()) //如果是实例方法,不同的实例化,他们的方法地址是不一样的,是唯一的
//如果是原型方法,那么他们地址是共享的,大家都是一样 alert(Box1.run()==Box2.run()) //true

如果是实例方法,不同的实例化,他们的方法地址是不一样的,是唯一的。

如果是原型方法,那么他们地址是共享的,大家都是一样。

为了进一步了解构造函数的声明方式和原型模式的声明方式,我们通过图示来了解一下。

在原型模式声明中,多于两个属性都是创建对象时自动生成 __proto__属性是实例指向原型对象的一个指针,

它的作用就是指向构造函数的原型属性constructor。通过这两个属性,就可以访问到原型里的属性和方法了。

ps:IE浏览器在脚本访问__proto__会不能识别,火狐和谷歌级其他浏览器可以识别,虽然可以输出,但是无法获取内部信息。

判断一个对象是否指向了构造函数的原型对象,可以使用isPrototypeOf()方法来测试。

        alert(Box.prototype.isPrototypeOf(Box1)); //弹出true
alert(Object.prototype.isPrototypeOf(Box1)); //弹出true

原型模式的执行流程:
1.先查询构造函数实例里的属性和方法,如果有,立即返回。
2.如果构造函数实例里没有,就去它的原型对象里去找,如果有,立即返回。

虽然我们可以通过对象实例访问保存原型中的值,但是不能访问通过对象实例通过对象实例重写原型中的值。

	function Box(){}  //构造函数函数体内什么都没有,这里如果有,也叫做实例函数,实例方法

        Box.prototype.name="link"; //原型属性
Box.prototype.age=25;
Box.prototype.run=function(){ //原型方法
return this.name+this.age+"运行中..."
}
var Box1=new Box();
var Box2=new Box(); Box1.name="html"; //实例属性,并没有重写原型属性
alert(Box1.name); //就近原则 弹出html

Javascript面对对象. 第二篇的更多相关文章

  1. Javascript面对对象. 第一篇

    Javascript,有两个种开发模式: 1.函数式(过程化)2.面对对象(oop),面对对象语言有一个标志,就是类,而通过类可以创建任何多个属性和方法,而Ecmascript没有类的概念,因此它的对 ...

  2. 深入理解javascript函数系列第二篇——函数参数

    × 目录 [1]arguments [2]内部属性 [3]函数重载[4]参数传递 前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传 ...

  3. 深入理解javascript作用域系列第二篇——词法作用域和动态作用域

    × 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极 ...

  4. 深入理解javascript作用域系列第二篇

    前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极易出错.这实际上是由两种作用域工作 ...

  5. Javascript面对对象. 第五篇

    继承 继承是面向对象中一个核心的概念.其他正统面向对象语言都会用两种方式实现继承: 一个是接口实现,一个是继承. 而ECMAScript只支持继承,不支持接口实现,而实现继承的方式依靠原型链完成. / ...

  6. Javascript面对对象. 第四篇

    原型模式创建对象也有自己的缺点,它省略看构造函数传参初始化这一过程,带来的缺点就是初始化的值都是一致的. 而原型最大的缺点就是它优点,那就是共享. 原型中所有属性是被很多实例共享的,共享对于函数非常合 ...

  7. Javascript面对对象. 第三篇

    3.字面量 为了让属性和方法很好的体现封装的效果,并且减少不必要的输入原型的创建可以使用字面量. function Box(){} //使用字面量的方法创建原型对象,这里的{}就是对象,是Object ...

  8. javascript面对对象编程 之继承

    上一篇博客中为大家介绍了javascript面向对象编程原则的封装,今天为大家介绍继承.在javascript中没有类的概念,全部不能像c#.java语言那样.直接的用类去继承类.比方如今有比方.如今 ...

  9. javascript运动系列第二篇——变速运动

    × 目录 [1]准备工作 [2]加速运动 [3]重力运动[4]减速运动[5]缓冲运动[6]加减速运动[7]往复运动[8]变速函数 前面的话 前面介绍过匀速运动的实现及注意事项,本文在匀速运动的基础上, ...

随机推荐

  1. 菊花加载第三方--MBprogressHUD

    上次说到了网络请求AFN,那么我们在网络请求的时候,等待期间,为了让用户不认为是卡死或程序出错,一般都会放一个菊花加载,系统有一个菊花加载类叫UIProgressHUD.但是我今天要说的是一个替代它的 ...

  2. 苹果应用商店AppStore审核中文指南 分类: ios相关 app相关 2015-07-27 15:33 84人阅读 评论(0) 收藏

    目录 1. 条款与条件 2. 功能 3. 元数据.评级与排名 4. 位置 5. 推送通知 6. 游戏中心 7. 广告 8. 商标与商业外观 9. 媒体内容 10. 用户界面 11. 购买与货币 12. ...

  3. VS2010下创建的VB.NET项目打包发布安装包的流程

    VS2010下创建的VB.NET项目打包发布安装包的流程 参考:http://blog.csdn.net/liuyanlinglanq/article/details/8609675  关于relea ...

  4. IOS block 对象强引用和若引用

    1. 在block外面这样:__weak MyController *weakSelf = self 或者 __weak __typeof(self) weakSelf = self;是为了防止强引用 ...

  5. eclipse 如何debug jdk源码(转)

    转:http://blog.csdn.net/cherrycheng_/article/details/51004386 原英文地址:http://stackoverflow.com/question ...

  6. 编译Uboot时提示error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory

    在Ubuntu14.04 64位系统中已经安装了libc6:i386的库,编译Uboot时提示error while loading shared libraries: libz.so.1: cann ...

  7. onethink插件二(首页图片轮播)

    2014年8月1日 15:34:15 基于slice-box 写了一个图片轮播的插件. 一.功能: 1.图片轮播功能 2.自定义功能(数量,效果,打开方式) 3.多重效果一键切换 4.独立性强,不影响 ...

  8. bzoj1468

    1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1023  Solved: 532[Submit][Status][Discuss] ...

  9. UVa 10427 - Naughty Sleepy Boys

    题目大意:从1开始往后写数字,构成一个如下的字符串 123456789101112... .求第n位的数字是多少. 找规律,按数字的位数可以构建一个类似杨辉三角的东西,求出第n位是哪个数的第几位即可. ...

  10. java短路问题

    java短路问题 短路运算符就是我们常用的"&&"."||",一般称为"条件操作". class Logic{ public ...