JS面向对象编程之对象(简化版)
上次网上看了一篇这个文章,然后乱七八糟晕头转向把我晕的够呛。看了半天没找到错的地方但是浏览器Hello world就是没有定义。。。我也是醉了,最后发现我认为是废话的话一句话竟然有用!!!所以我还是简化一下,大家看着都舒服
首先先实例化一个函数
function HelloWorld()
{
alert('hello world!');
}
然后针对这个函数给他new一个
function _test()
{
var obj = new HelloWorld();
}
然后调用方法可以使用this.name调用了
HelloWorld.prototype = {
name : 'JavaScript',
sayHello : function() {
alert(this.name);
}
}
然后可以给他加方法了
function _test()
{
var obj = new HelloWorld();
obj.sayHello();
}
那么调用_test方法后就会先后打印hello
wordl!和JavaScript(一个是构造方法中的alert,一个是sayHello方法中的alert)。注意sayHello方法中的
alert引用了this关键字,该关键字表示的就是HelloWorld对象,即默认指向该对象,和JAVA中的this关键字一样。
对于向一个对象添加实例方法和属性,我们可以采用上述的方式,即使用prototype关键字进行赋值,格式如下:
对象名称.prototype = {
属性一 : 属性值,
属性二 : 属性值,
方法一 : function(参数列表) {
方法体;
},
方法二 : function(参数列表) {
方法体;
}
}
以下为扩展!!!!!!!
可以按照如上方式对一个对象进行多个属性和方法的定义,这样在new一个对象后,就可以使用实例名称.属性或方法来获取属性或执行方法了。
在上面的方法中,大家不知道发现没有对象的属性是可以直接访问的,比如访问HelloWorld对象的name属性就可以使用obj.name直接获取。
这就好比我们JAVA中的公有属性了,而且我们还可以直接对name属性进行赋值操作。所以现在有一个问题了,我们如何给一个对象赋一个私有成员变量呢?
那我们就可能要改一下HelloWorld类的声明方式了,不使用prototype进行类的属性和方法声明,而是直接使用内嵌函数和属性进行声明,修改
的HelloWorld如下,我们命名为HelloWorld2:
function HelloWorld2()
{
var privateProp = 'hello world 2!';
this.method = function() {
alert(privateProp);
}
}
看到HelloWorld2的类申明方式了没?是直接在函数内部进行了函数嵌套申明,而且我们还设置了一个局部变量privateProp,即我们的私有
成员变量,该变量只能被HelloWorld2内部的函数进行访问,外部访问是不允许的,这样我们就可以通过使用变量的作用域来巧妙的设置类的私有变量
了。我们应用如下:
function _test2()
{
var obj2 = new HelloWorld2();
obj2.method(); // 调用该方法将打印'hello world 2!
alert(obj2.privateProp); // 将打印undefined
}
上面所说的都是如何定义一个类,以为如何为一个类定义属性和方法,由于采用prototype方式进行定义清晰明了,所以一般都是使用该方式进行类的定
义,而且现在很多AJAX框架中都使用了类似的类声明方式。而且类的私有成员变量却只能在类的构造方式中的函数进行访问,这样类的prototype声明
的方法就不能访问该私有成员变量了,而且可读性方面也没有prototype方式好。
好了,上面所说的都是定义一个类的实例方法和属性。在JAVA中类有实例方法和属性与类方法和属性之分。所谓类属性和方法就是该类的所有实例都只维护一份
类属性和类方法的副本,而不是每个实例都维护一套,这和实例属性和实例方法是不一样的。那么在JS中如何为一个类定义静态类方法和类属性呢?我们可以直接
为类添加静态属性和静态方法,比如为HelloWorld类添加一个age的静态属性和一个hello的静态方法,那么声明如下:
HelloWorld.age = 22;
HelloWorld.hello = function() {
alert(HelloWorld.age);
}
那么这样就为类HelloWorld声明了静态属性age和静态方法hello了。在使用的时候就直接使用类名进行访问了,但是不能使用实例进行访问,这点与JAVA中的是一致的,测试如下:
function _test()
{
var obj = new HelloWorld();
obj.sayHello(); // 正确,实例方法,可以通过实例进行访问
HelloWorld.hello(); // 正确,静态方法,通过类名进行直接访问
obj.hello(); // 错误,不能通过实例访问静态方法。会报JS错误!
}
JS面向对象编程之对象(简化版)的更多相关文章
- JS面向对象编程之对象
在AJAX兴起以前,很多人写JS可以说都是毫无章法可言的,基本上是想到什么就写什么,就是一个接一个的函数function,遇到重复的还得copy,如果一不小心函数重名了,还真不知道从何开始查找错误,因 ...
- JS面向对象编程之封装
来源:https://segmentfault.com/a/1190000015843072 我们所熟知的面向对象语言如 C++.Java 都有类的的概念,类是实例的类型模板,比如Student表示学 ...
- JS面向对象编程之:封装、继承、多态
最近在实习公司写代码,被隔壁的哥们吐槽说,代码写的没有一点艺术.为了让我的代码多点艺术,我就重新温故了<javascript高级程序设计>(其中几章),然后又看了<javascrip ...
- Scala编程入门---面向对象编程之对象
对象 Object,相当于class单个实例,通常在里面放一些静态的filed或method 第一次调用object方法时候,就会执行object的constructor,也就是Object中不在me ...
- 8、scala面向对象编程之对象
1. Object 2.伴生对象 3.让object继承抽象类 4.apply方法 5.main方法 6.用object实现枚举功能 1. Object Object,相当于class的单个实例, ...
- Scala 面向对象编程之对象
此对象非彼java bean对象 是scala object的对象 Object // object,相当于class的单个实例,通常在里面放一些静态的field或者method // 第一次调用ob ...
- 深入理解JavaScript系列(17):面向对象编程之概论
介绍 在本篇文章,我们考虑在ECMAScript中的面向对象编程的各个方面(虽然以前在许多文章中已经讨论过这个话题).我们将更多地从理论方面看这些问题. 特别是,我们会考虑对象的创建算法,对象(包括基 ...
- 深入理解JS中的对象(一)
目录 一切皆是对象吗? 对象 原型与原型链 构造函数 参考 1.一切皆是对象吗? 首先,"在 JavaScript 中,一切皆是对象"这种表述是不完全正确的. JavaScript ...
- 深入理解JS中的对象(二):new 的工作原理
目录 序言 不同返回值的构造函数 深入 new 调用函数原理 总结 参考 1.序言 在 深入理解JS中的对象(一):原型.原型链和构造函数 中,我们分析了JS中是否一切皆对象以及对象的原型.原型链和构 ...
随机推荐
- PowerDesigner数据库设计实用技巧
欢迎大家补充,谢谢! 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的 ...
- mysql数据出现Unknown column 'user_uid' in 'field list' sql错误
来源:https://blog.csdn.net/gnail_oug/article/details/53606608 在操作mysql数据库时提示com.mysql.jdbc.exceptions. ...
- 【MOOC EXP】Linux内核分析实验三报告
程涵 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 [跟踪分析Linux内核的启动过程] ...
- linux内核分析第一周学习笔记
linux内核分析第一周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...
- Linux内核分析第四周总结
用户态,内核态和中断处理过程 库函数将系统调用封装起来 用户态和内核态的差别: 在内核态时,cs和eip的值可以是任意地址,但在用户态时只能访问0x00000000 - 0xbfffffff,0x00 ...
- blob下载出现多余乱码内容
blob需要单独获取,,不能通过map来获取 jdbcTemplate.query(sqlcontent, new Object[] {id}, new AbstractLobStreamin ...
- 什么是GPS的冷启动、温启动和热启动?
对于GPS多种启动方式的概念还很模糊,冷启动.热启动.温启动各种专业术语铺天盖地,使得许多用户眼花缭乱. 我们简单从定义上了解一下几种GPS启动的方式,GPS开机启动分为冷启动.温启动.热启动三种. ...
- Beta 冲刺 七
团队成员 051601135 岳冠宇 031602629 刘意晗 031602248 郑智文 031602330 苏芳锃 031602234 王淇 项目进展 岳冠宇 昨天的困难 换了种方法写了搜索栏, ...
- 11th 回忆整个学期——告学弟学妹
告诉后来的学弟学妹,不要因为艰难而却步,坚持下去才知道,山的对面是什么.很多东西或许一开始看起来是无用,甚至无意义的,但是努力去做,你才知道价值所在.不要等一切结束了,才懂得自己错过了什么.
- PAT 甲级 1115 Counting Nodes in a BST
https://pintia.cn/problem-sets/994805342720868352/problems/994805355987451904 A Binary Search Tree ( ...