javascript 静态对象和构造函数的使用和公私问题
var objJson={
op1:'objJson option1',
fn1:function(){
alert(this.op1)
}
}
在这种形式的声明下,你可以通过objJson.op1或者objJson.fn1()来直接访问内部的属性,这没有问题。但是如果是这样:
代码如下:
var objFn=function(){
this.op1='objFn.op1';
this.op2=function(){
alert(this.op1)
};
}
那么如果你直接objFn.op1或者objFn.op2()来访问内部的属性的话,就不行了,因为这个时候他还不是个对象。
所以我们需要将他实例化
代码如下:
var inst=new objFn();
alert(inst.op1);
inst.op2();
这样就可以得到你想要的值了。
如果你想复制JSON形式的对象,很简单,但是有一个问题:
代码如下:
var newone=objJson;
newone.op1='changed';
alert('objJson.op1');
你会发现原来的对象中的op1的值也发生了改变。但是如果使用的第二种的对象声明的办法,那么修改只是在实例的内部,不会影响其他的实例。
所以像JSON这样的静态对象适合在写一些常用的库的时候使用,有他自己的命名空间,谁也不会干扰到谁,而且方便使用。
构造函数的"公有""私有"属性
我们将上面的构造函数做一个修改:
代码如下:
var objFn=function(){
var pri1='私有变量';
this.op1='公共变量';
this.op2=function(){
alert(pri1+','+this.op1);
};
};
var o=new objFn();
alert(typeof o.pri1+','+typeof o.op1);//undefined,string
o.op2();//私有变量,公共变量
私有变量在对象外是不允许访问的,所有typeof以后是undefined。下面我们看看私有方法的访问:
代码如下:
var objFn=function(){
var pri1='私有变量';
var pri2=function(){
this.op2();
};
this.op1='公共变量';
this.op2=function(){
alert(pri1+','+this.op1);
};
this.acPri=function(){
pri2.call(this);
};
};
var o=new objFn();
o.acPri();//私有变量,公共变量
注意到这里因为JavaScript的闭包特性,我们通过公有方法acPri()调用私有方法pri2的时候需要使用call将程序的上下文传递进去,不过就是这个看起来绕来绕去的太晕,可以稍稍的包装一下:
代码如下:
var objFn=function(){
var my=this;
var pri1='私有变量';
var pri2=function(){
my.op2();
};
this.op1='公共变量';
this.op2=function(){
alert(pri1+','+this.op1);
};
this.acPri=function(){
pri2.();
};
};
var o=new objFn();
o.acPri();//私有变量,公共变量
当然最后的结果还是不变。
转载请保留以下信息
作者:北玉(tw:@rehawk)
相关推荐
-
Javascript 构造函数,公有,私有特权和静态成员定义方法
复制代码 代码如下: //构造函数 function myClass(message) { //公有属性 this.myMessage = message; //私有属性 var _separator = ' -'; var _myOwner = this; //私有方法 function showMessage() { alert(_myOwner.myMessage); } //特权方法(也是公有方法) this.appendToMessage = function(appendMessag
-
Javascript面向对象编程(三) 非构造函数的继承
今天是最后一个部分,介绍不使用构造函数实现"继承". 一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". 复制代码 代码如下: var Chinese = { nation:'中国' }; 还有一个对象,叫做"医生". 复制代码 代码如下: var Doctor ={ career:'医生' } 请问怎样才能让"医生"去继承"中国人",也就是说,我怎样才能生成一个&
-
JavaScript 原型继承之构造函数继承
上回说到<JavaScript 原型继承之基础机制>,这一篇将具体说说构造函数的继承. 从一个简单的示例开始,创建描述人类的 People 构造函数: 复制代码 代码如下: function People(){ this.race = '愚蠢的人类'; } 然后,创建描述黄种人的 Yellow 构造函数: 复制代码 代码如下: function Yellow(name, skin){ this.name = name; this.skin = skin; } 要使得黄种人 Yellow 能继承
-
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
JavaScript中的对象模型(object model)并不广为人知.我曾写过一篇关于他们的博客.之所以不被人所熟知,原因之一就是JavaScript是这些被人广泛使用的语言中唯一一个通过原型(prototype)来实现继承的.但是,我认为另一个原因就是这种对象模型非常复杂,难于解释.它为什么这么复杂并且又令人困惑呢?那是因为JavaScript试图去隐藏它传统的面向对象的特性--最终导致了它的双重人格(译者注:作者意思是JavaScript既有面向过程的特征,又有面向对象的特征). 我认为
-
Javascript面向对象编程(二) 构造函数的继承
今天要介绍的是,如何生成一个"继承"多个对象的实例. 比如,现在有一个"动物"对象的构造函数, 复制代码 代码如下: function Animal(){ this.species = "动物"; } 还有一个"猫"对象的构造函数, 复制代码 代码如下: function Cat(name,color){ this.name = name; this.color = color; } 怎样才能使"猫"继承&
-
JavaScript 构造函数 面相对象学习必备知识
复制代码 代码如下: function A(x) { this.x = x; } var obj = new A(5); alert(obj.x); 这段代码十分简单,但是我们重要的是看到了一个十分惊讶的结果,obj被我们赋予了一个属性x,就如同我们在C#中使用某个类的实例的时候一样.那么这个属性是怎么样产生的呢? 关键语句:this.x=x.这句话就是进行一个属性的申明与赋值,这里,我们肯定会问到,this是什么?为什么可以使用this.x来进行申明与赋值属性呢? 其实this代表的就是我们刚
-
javascript 混合的构造函数和原型方式,动态原型方式
我们日常JS编程中最常用的方式 有下面2种: 1.混合的构造函数和原型方式 (重点) 复制代码 代码如下: function car (sColor,iNumbers){ // 构造函数只用来定义对象的所有非函数属性,即对象的属性 this.color = sColor; this.numbers = iNumbers; this.dirvers = new Array ("Jone","Leon"); } car.prototype.showColor = fun
-
javascript 构造函数强制调用经验总结
兴致勃勃地定义了下面这么个构造函数: 复制代码 代码如下: var Coder = function( nick ){ this.nick = nick; }; 定义构造函数结束后呢?没错,赶紧实例化: var coder = Coder( 'casper' ); 这个coder兄弟叫什么名字?赶紧打印下: 复制代码 代码如下: console.log( coder.nick ); //undefined = =b 竟然是undefined!!再回过头看看实例化的那个语句,不难发现问题出在哪里:
-
JavaScript面向对象设计二 构造函数模式
我们将使用构造函数模式将工厂模式进行改写. 复制代码 代码如下: function Employee(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function () { alert(this.name); }; } var Jim = new Employee("jim", 22, "SoftWare Engineer"); var Sun
-
javascript 静态对象和构造函数的使用和公私问题
先看: 复制代码 代码如下: var objJson={ op1:'objJson option1', fn1:function(){ alert(this.op1) } } 在这种形式的声明下,你可以通过objJson.op1或者objJson.fn1()来直接访问内部的属性,这没有问题.但是如果是这样: 复制代码 代码如下: var objFn=function(){ this.op1='objFn.op1'; this.op2=function(){ alert(this.op1) };
-
JavaScript原型对象、构造函数和实例对象功能与用法详解
本文实例讲述了JavaScript原型对象.构造函数和实例对象功能与用法.分享给大家供大家参考,具体如下: 大家都知道,javascript中其实并没有类的概念.但是,用构造函数跟原型对象却可以模拟类的实现.在这里,就先很不严谨的使用类这个词,以方便说明. 下面整理了一些关于javascript的构造函数.原型对象以及实例对象的笔记,有错误的地方,望指正. 先用一张图简单的概括下这几者之间的关系,再细化: 构造函数和实例对象 构造函数是类的外在表现,构造函数的名字通常用作类名. 其实构造函数也就
-
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
本文实例讲述了JavaScript 面向对象程序设计.分享给大家供大家参考,具体如下: 类的创建于实例对象 工厂模型创建对象 function CreatePerson ( name,sex,age ) { var obj = new Object(); obj.name = name; obj.sex = sex; obj.age = age; obj.sayName = function () { console.log( this.name ); } return obj; } var p
-
isArray()函数(JavaScript中对象类型判断的几种方法)
1) typeof 运算符 typeof 是一元运算符,返回结果是一个说明运算数类型的字符串.如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在). 但 typeof 的能力有限,其对于Date.RegExp类型返回的都是"object".如: typeof {}; //
-
Javascript基于对象三大特性(封装性、继承性、多态性)
Javascript基于对象的三大特征和C++,Java面向对象的三大特征一样,都是封装(encapsulation).继承(inheritance )和多态(polymorphism ).只不过实现的方式不同,其基本概念是差不多的.其实除三大特征之外,还有一个常见的特征叫做抽象(abstract),这也就是我们在一些书上有时候会看到面向对象四大特征的原因了. 一.封装性 封装就是把抽象出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作(成员方法),
-
javascript包装对象实例分析
本文实例讲述了javascript包装对象用法.分享给大家供大家参考.具体分析如下: js对象是一种复合值:它是属性或已命名值得集合. 参考以下代码: var s = "hello world"; var len = s.length; 在该例子中,s是字符串,而字符串不是对象,但为何会有属性呢?其实只要引用了字符串s的属性,js就会将字符串通过调用new String(s)的方式转换为对象,该对象继承了字符串的方法,并被用来处理属性的引用:一旦属性引用结束,这个新创建的对象就会被销毁
-
Javascript 使用function定义构造函数
Javascript中创建对象的语法是在new运算符的后面跟着一个函数的调用.如 复制代码 代码如下: var obj = new Object(); var date = new Date(); 运算符new首先创建一个新的没有任何属性的对象,然后调用该函数,把新的对象作为this关键字的值传递. 复制代码 代码如下: var date = new Date()的伪代码的实现就是 var obj = {}; var date = Date.call(obj); 构造函数的作用就是初始化一个新创
-
JavaScript中对象的不同创建方法
javascript中的对象与一般的面向对象的程序设计语言(c++,Java等)不同,甚至很少有人说它是面向对象的程序设计语言,因为它没有类.javaScript只有对象,不是类的实例.javascript中的对象是基于原型的. 1.1句点运算符创建 javascript中的对象实际上就是一个由属性组成的关联数组,属性由名称和值组成,值的类型可以是任何数据类型,或者函数和其他对象. 创建一个简单对象: var foo = {}; foo.prop_1 = 'bar'; foo.prop_2 =
-
RegExp 随笔 JavaScript RegExp 对象
概述 RegExp 的构造函数创建了一个正则表达式对象,用模式来匹配文本. 有关正则表达式介绍,请阅读JavaScript指南中的正则表达式章节. 语法 文字和构造符号是可能的: /pattern/flags new RegExp(pattern [, flags]) 参数 pattern 正则表达式的文本 flags 如果指定,标志可以具有以下值的任意组合: g 全局匹配 i 忽略大小写 m 多行;让开始和结束字符(^ 和 $)工作在多行模式工作(例如,^ 和 $ 可以匹配字符串中每一行的开始
-
Javascript Object 对象学习笔记
构造函数 new Object() new Object(value) 参数 value 可选的参数,声明了要转换成Number对象.Boolean对象或String对象的原始值(即数字.布尔值或字符串).JavaScript 1.1之前的版本和ECMAScript Vl不支持该对象. 返回值 如果没有给构造函数传递value参数,那么它将返回一个 新创建的Object实例.如果指定了原始的value参数,构造函数将创建并返回原始值的包装对象,即Number对象.Boolean对象或 S
随机推荐
- Android获取系统储存以及内存信息的方法(二)
- Vue 2.0 服务端渲染入门介绍
- 学习shell脚本之前的基础知识[图文]
- php 备份数据库代码(生成word,excel,json,xml,sql)
- git冲突解决_动力节点Java学院整理
- 如何在自己的电脑上配置APNS推送环境
- 读取纯真IP数据库的公用组件接口QQWry.NET
- yii2中添加验证码的实现方法
- Vue.js第一天学习笔记(数据的双向绑定、常用指令)
- android教程使用webview访问https的url处理sslerror示例
- 源代码快速定位工具-qwandry使用指南
- Ruby简明教程之判断语句介绍
- java 学习笔记(入门篇)_java程序helloWorld
- 配置fail2ban对Apache服务器进行安全防护的方法
- jquery验证手机号码、邮箱格式是否正确示例代码
- jQuery 获取/设置/删除DOM元素的属性以a元素为例
- 学习二维动态数组指针做矩阵运算的方法
- php实现批量下载百度云盘文件例子分享
- phplot生成图片类用法详解
- Python中存取文件的4种不同操作