目录:

  1. constructor & prototype
  2. 为构造函数添加属性和方法的多种不同方法
  3. 组合使用this和prototype关键字创建构造函数(常用方法)
  4. 用对象直接量作为构造函数的参数
  5. 方法的链式调用
  6. 继承:JavaScript中通过对象的原型链实现原型继承
  7. 多态:将某个方法替换为一个同名的功能类似的方法,只是做了针对性的改变。只需要重写一个函数并给它和原方法相同的方法即可
  8. JavaScript函数的apply和call方法
  9. JavaScript函数的apply和call方法(待完善)
  10. 公有、私有以及受保护的属性和方法

1.constructor & prototype

function Accom(){};    //创建一个构造函数

//创建两个对象

var house=new Accom();

var apartment=new Accom();

通过构造函数创建的对象有一个属性constructor,这个属性指向创建该对象时所用的Javascript构造函数。

house.constructor===Accom;  或者   house instanceof Accom;     //true

JavaScript中的每个构造函数都有一个prototype的属性,这个属性指向一个对象。当用关键字new来创建一个对象实例时,实例中所包含的属性和方法都来自prototype所指向的这个对象


 2.为构造函数添加属性和方法的多种不同方法

function Accom(){};
Accom.prototype={
share: false,
unlock: function(){}
}; //通过对象直接量为构造函数添加属性和方法
Accom.prototype.rooms=5; //通过protype关键字添加属性
Accom.prototype.lock=function(){}; //通过protype关键字添加方法

在所有嵌套函数中都可以访问定义在其父函数中的变量


 3.组合使用this和prototype关键字创建构造函数(常用方法)

一般用this关键字来初始化那些希望在对象创建时进行初始化的属性,而用prototype设置其他属性以及对象的方法。每次通过构造器创建一个新的对象实例,构造函数都会被执行一次,而通过prototype关键字来定义只需要定义一次。

function Accom(floors,rooms){
this.floors=floors||0; //设置默认值0
this.rooms=rooms||7; //设置默认值7
}
Accom.prototype.isLocked=false;
Accom.prototype.lock=function(){
this.isLock=true;
}; var house=new Accom(2,5); //实例化类

 4.用对象直接量作为构造函数的参数

当类的规模越来越大时给对象实例的属性设置初始值比较麻烦,可以用对象直接量

function Accom(defaults){
defaults=defaults||{} //如果没有传入值默认为空的对象直接量
//如果defaults对象含有某个属性,就将实例对象中同名属性的值设为defaults提供的值,否则设为默认值
this.floors=defaults.floors||0;
this.rooms=defaults.rooms||0;
} Accom.prototype.isLock=false;
Accom.prototype.lock=function(){
this.isLock=true;
} //实例化一个对象
var house=new Accom({
floors:2,
rooms:7
});

5.方法的链式调用  

只需要在“类”中的每个方法最后通过this关键字返回对象实例的引用就可以实现链式调用

function Accom(){}
Accom.prototype.lock=function(){
this.isLocked=false;
return this; //通过返回上下文返回的是调用这个函数的对象,这个对象包含所有的方法,因此可以在本方法后调用其他方法
}; Accom.prototype.alarm=function(){
alert("Sounding alarm!");
return this;
}; var house=new Accom(); house.lock().alarm(); //实现链式调用

6.继承:JavaScript中通过对象的原型链实现原型继承

function Accom(){
this.isLocked=false;
this.isAlarmed=false;
} //父类
Accom.prototype.lock=function(){
this.islocked=true;
};
Accom.prototype.unlock=function(){}; function House(defaults){
defaults=defaults||{};
this.floors=2;
this.rooms=defaults.rooms||7;
} //将House类的原型设为Accom类的一个实例,这个实例包含其所有属性和方法,然后传递给House类的原型
House.prototype=new Accom(); House.prototype.constructor=House; //上一步传递给House过程constructor的值也被复制,需要重设constructor使其指向新的子类 var myHouse=new House;
myHouse.lock(); //继承了Accom的方法
alert(myHouse instanceof Accom); //true,因为House继承自Accom

 7.多态:将某个方法替换为一个同名的功能类似的方法,只是做了针对性的改变。只需要重写一个函数并给它和原方法相同的方法即可。

//上面的例子中,针对House类重定义lock方法,即多态
House.prototype.lock=function(){
//通过call方法将上下文传递给父类Accom的lock方法,从而确保lock方法中任何对this的引用都指向当前这个House的对象实例
Accom.prototype.lock.call(this);
alert(this.isLocked); //true,说明调用正确
}

8.JavaScript函数的apply和call方法。call和apply区别在于,使用apply时,所有参数都放在一个单独数组中,而call中参数依次列出用逗号隔开。

function Accom(){
this.isAlarmed=false;
} //定义一个类 var Alarm={
arm: function(message){
this.isAlarmed=true;
alert(message);
}
}; //创建一个对象,其方法可以被代码中其他对象所使用 var myHouse=new Accom(); Alarm.arm.call(myHouse,"Alarm activated"); //通过call将对象实例myHouse上下文传入arm函数 alert(myHouse.isAlarmed); //true,改变了

9.arguments对象 依次包含了传入函数的各个参数的一个数组,该数组不具备标准数组的其他方法(例如排序)

使用函数apply方法时,arguments就可以体现其价值,因为apply方法将所有参数放入一个数组内进行传递。


10.公有、私有以及受保护的属性和方法

var Accom=(function(){
function Accom(){};
//此处定义为私有变量
var _isLocked=false,_alarmMessage="Alarm activated!";
//在当前作用域上定义的函数(而未在构造函数原型删定义)为“私有的”
function _alarm(){
_isLocked=true;
alert(_alarmMessage);
} //所有在原型上定义的方法为公有的,此处可以访问私有方法和变量
Accom.prototype.lock=function(){
_isLocked=false;
_alarm();
}; //定义一个函数对私有变量进行只读访问
Accom.prototype.getIsLocked=function(){
return _isLocked;
}; //定义一个函数对私有变量进行只写访问
Accom.prototype.setAlarmMessage=function(message){
_alarmMessage=message;
}; //返回这个作用域中的类,使之在外层作用域中可用
return Accom;
}()); var house=new Accom();
house.lock();      //弹出警告消息 “Alarm activated”
house.alarm();     //错误!_alarm函数从未被公开

JavaScript中的构造函数的更多相关文章

  1. JavaScript中的构造函数和工厂函数说明

    在cnblog上看到一篇文章,讲解JS中的构造函数和工厂函数,觉得讲的真好 JavaScript中的工厂函数和构造函数都能用来创建一个对象,我们可以来看看下面的例子 构造函数 function cre ...

  2. JavaScript中的构造函数和原型!

    JavaScript中的原型! 原型的内容是涉及到JavaScript中的构造函数的 每一个构造函数都有一个原型对象!prototype 他的作用是 共享方法!还可以扩展内置对象[对原来的内置对象进行 ...

  3. JavaScript中以构造函数的方式调用函数

    转自:http://www.cnblogs.com/Saints/p/6012188.html 构造器函数(Constructor functions)的定义和任何其它函数一样,我们可以使用函数声明. ...

  4. JavaScript中的构造函数 renturn

    javascript中构造函数是不需要有返回值的,但是如果其中添加了 return 语句结果会如何呢: 看如下代码: 示例1. var Calculator = function () { retur ...

  5. JavaScript 中的构造函数

    典型的面向对象编程语言(比如C++和Java),存在“类”(class)这个概念.所谓“类”就是对象的模板,对象就是“类”的实例.但是,在JavaScript语言的对象体系,不是基于“类”的,而是基于 ...

  6. 关于javascript中的构造函数和普通函数探索 [转]

    这是第一篇关于javascript模块的文章,在javascript入门的目录下,主要是记录一些对网上精彩的js研读碰到的疑惑,并做一些实验和探索 关于js中的对象和方法的定义博主感到非常的迷惑.针对 ...

  7. javascript中的构造函数和继承

    1.第一节 使用工厂模式创建一个构造函数CreatePerson function CreatePerson(name,sex){//构造函数:用于构造对象 可以说在js里类就是构造函数 //1.原料 ...

  8. javascript中的构造函数和原型及原型链

    纯属个人理解,有错误的地方希望大牛指出,以免误人子弟 1.构造函数: 构造函数的作用 : 初始化由new创建出来的对象    new 的作用: 创建对象(空对象) new 后面跟的是函数调用,使用ne ...

  9. JavaScript中的普通函数和构造函数

    在写JavaScript代码过程中,用到需要写构造函数的地方不多,但还是需要详细了解一下 本文尽量描述清楚什么是JavaScript中的构造函数,以及普通函数和构造函数的区别

随机推荐

  1. 不同版本的 IIS 中使用 ASP.NET MVC(C#)【转】

    由微软 ASP.NET 团队|2008 年 8 月 19 日 推特 在本教程中,您将学习在不同版本的 Internet Information Services 中如何使用 ASP.NET MVC 和 ...

  2. Robotium双client測试框架

    互联网的本质就是信息交换.移动互联网更是如此, 所以很多移动互联网的服务类应用中有着身份地位不同的两种用户(比如:交易中的买家和卖家, 教学中的老师和学生, 打车中的车主和乘客).近期的工作是给公司的 ...

  3. 使用Vitamio打造自己的Android万能播放器(1)——准备

    前言 虽然Android已经内置了VideoView组件和MediaPlayer类来支持开发视频播放器,但支持格式.性能等各方面都十分有限,这里与大家一起利用免费的Vitamio来打造属于自己的And ...

  4. 利用js_API 运行对html文档元素的属性的CRUD操作

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 第三章SignalR在线聊天例子

    第三章SignalR在线聊天例子 本教程展示了如何使用SignalR2.0构建一个基于浏览器的聊天室程序.你将把SignalR库添加到一个空的Asp.Net Web应用程序中,创建用于发送消息到客户端 ...

  6. viewPager使用时加载数据时显示IllegalStateException异常,解决不了。。。。

    从newsPager中得到newsDetailTitles标题的详细内容,这是通过构造器传过来的.打印日志78行能打印,45行打印出来共size是12.但是程序出现了异常java.lang.Illeg ...

  7. Java Eclipse常规设置

    改变字体大小 eclipse英文版中如何去修改字体及方法?首先打开eclipse中,按下面的方法即可菜单项:window ->preferences -> general -> ap ...

  8. 自己配置的WAMP环境,扩展oracle函数库(oci)

    同事昨天接到一个任务,要用php处理oracle数据库的内容,但是php打开oracle扩展不是像mysql那样直接用就行,需要下一点东西才能打开 第一步 需要到oracle官方下载一个install ...

  9. HTML中的uniqueID

    Web页面上元素的name属性本身是可以重复的,理论上讲id是不可以重复的,但是现在的浏览器对重复的id都是默许的,可能有时候页面是需要一个唯一编号的.IE浏览器为页面上的所有元素都是提供了一个唯一名 ...

  10. 软件测试学习日志————round 0 An impressed error in my past projects

    在初学各种语言时总会出现各种错误,比如main携程mian.忘了加各种库,打错字等等等等.虽然这些错误后面看来很幼稚,但是有的时候真的会让人印象很深刻. 在初学JavaScript时,我对JavaSc ...