JS的核心是对象

{},

new function(){}这种形式也是对象。

http://www.nowamagic.net/librarys/veda/detail/241

整理一些网上的资料,供参考

1.创建对象

1.1 new

用new进行创建对象:

  1. var user = new Object();
  2. user.age = 12;//同时为对象添加属性
  3. user.name = ‘ajun’;

1.2{}

用{}创建对象,如:

  1. var user = {
  2. ‘name’:’ajun,
  3. ‘age’:12
  4. }

这里同时候为user添加了两个属性分别为:name,age

在以上代码稍加改造,你还可以为一个对象添加一个方法,如:

  1. var user = {
  2. ‘name’:’ajun’,
  3. ‘age’:12
  4. ‘say’:function(){
  5. alert(this.name);//this代表当前对象
  6. }
  7. }

2.类和构造函数

2.1如何定义

在javascript中,所有的变量和方法都是对象,都可以用做参数相互传递的。

看以下这个方法:

  1. function User(name,age){
  2. this.name = name;
  3. this.age = age;
  4. this.say = function(){
  5. alert(this.name+’ say hello!!’);
  6. }
  7. }

此时你可以这样理解,User你可以看成一个类的名字,而User()就是这个类得构造方法,这点有点类似于java中的类和构造方法必须同名,在new的时候调用其构造方法,一些初始化操作,可以放在你的构造方法内,这里我们用于初始化name和age属性的值,以下创建User对象的代码:

  1. var user = new User(‘ajun’ ,24);
  2. user.say();//ajun say hello!!

在这里解释以下this

当我们在new对象的时候,实际会调用一个被叫做的call(),将当前对象做为参数传递进行,赋值给this,所以this就是指当前引用对象

3.原型

3.1 prototype

在 JavaScript 中,每个方法都有名为“prototype”的属性,用于引用原型对象,看如下代码:

  1. function User(){
  2. this.name = ‘ajun’;
  3. this.age = 24;
  4. this.say = function(){
  5. alert(this.name+’ say hello!!’);
  6. }
  7. }

这个User就会有prototype的属性,引用的时候就可以这样 User.prototype 就可以了,当你new User对象的时候,这个对象就会继承来自User. prototype的所有的属性,而User. prototype又继承自Object.prototype的所有的属性,所以你才可以在你对象上调用toString()等方法,其实他都是Object. Prototype的属性,只是被你的对象继承过来了而已,在这里你可以理解为java的类得继承,子类继承父类。

有prototype的概念,我们就可以通过prototype给User添加方法、属性了,这样以后每个user对象都共享方法和属性,而不是每个对象都会有他们的副本了。

  1. function User(){
  2. this.name = ‘ajun’;
  3. this.age = 24;
  4. }
  5. User. prototype. say = function(){
  6. alert(this.name+’ say hello!!’);
  7. }
  8. var user = new User();
  9. user.say();
  10. var user2 = new User();
  11. user2.say();

这样我们在new 完一个User对象的时候,调用完这个方法的时候,他还可以供其他方法继续使用。

3.2原型链

每个 JavaScript对象都继承一个原型链,而所有原型都终止于 Object.prototype。注意,迄今为止您看到的这种继承是活动对象之间的继承。它不同于继承的常见概念,后者是指在声明类时类之间的发生的继承。因此,JavaScript 继承动态性更强。它使用简单算法实现这一点,如下所示:当您尝试访问对象的属性/方法时,JavaScript 将检查该属性/方法是否是在该对象中定义的。如果不是,则检查对象的原型。如果还不是,则检查该对象的原型的原型,如此继续,一直检查到 Object.prototype。

JavaScript 动态地解析属性访问和方法调用的方式产生了一些特殊效果:

@ 继承原型对象的对象上可以立即呈现对原型所做的更改,即使是在创建这些对象之后。

@ 如果在对象中定义了属性/方法 X,则该对象的原型中将隐藏同名的属性/方法。例如,

通过在 User.prototype 中定义 toString 方法,可以改写Object.prototype 的 toString 方法。

@ 更改只沿一个方向传递,即从原型到它的派生对象,但不能沿相反方向传递。

例子:

  1. function User(){
  2. this.name = ‘ajun’;
  3. this.age = 24;
  4. }
  5. User. prototype. toString = function(){
  6. alert(this.name+’ say hello!!’);
  7. }
  8. var user = new User();
  9. user. toString ();

此时Object.prototype的toString会被覆盖掉。这样就不会调用Object.prototype的toString了,也就不会输出[Object Object],而输出的是ajun say hello!!了

4.静态属性和方法

有的时候 ,你想不想就像java中那样,通过类直接来操作你的属性和方法,其实在java中这些都是静态属性啦,直接通过类名来引用,在JavaScript中也是可以做的,请看下面的代码:

  1. function User(){}
  2. User.age = 12;
  3. User.name = ‘ajun’;
  4. User.say = function(){
  5. return ‘ajun’;
  6. }
  7. alert(User.say());

之后就可以用方法名字直接引用你的方法或者属性了,而不用在new一次对象了。

5.私有属性

正常情况下,无法从函数以外访问函数内的本地变量。函数退出之后,由于各种实际原因,该本地变量将永远消失。但是,如果该本地变量被内部函数的闭包捕获,它就会生存下来。这一事实是模拟 JavaScript 私有属性的关键,如:

  1. function User(name,age){
  2. this.setName = function(newName){
  3. name = newName;//name相当于setName的name属性
  4. };
  5. this.getName = function(){
  6. return name;
  7. }
  8. this.getAge = function(){
  9. return age;
  10. };
  11. this.setAge = function(newAge){
  12. age = newAge;
  13. };
  14. }
  15. var user = new User('ajun',24);
  16. alert(user.getName)//ajun
  17. user.setName('lisi',12);
  18. var newName = user.getName();
  19. alert(newName);//lisi

或者这样也是可以模拟似有属性的,因为name超出其作用域,是不可以被访问的

  1. function User (name, age) {
  2. var name;
  3. this.getName = function() { return name; };
  4. this.setName = function(newName) {
  5. name =  newName;
  6. };
  7. }
  8. var user = new User ('ajun’,12);
  9. user. setName('qq');
  10. alert(p.getName());

注意:你设定的私有属性,是不能被这个方法内的其他公共方法访问的(指的是共享的方法,通过User.prototype定义的方法),这一点和java是不类似的

只能通过在其闭包内拥有这些私有成员的方法来访问私有成员

如:下面的代码 ,是不可以工作的

  1. User.prototype.somePublicMethod= function() {
  2. alert(this.getName());
  3. }

5.命名空间

这里所说的命名空间就相当于我们在java中使用包的概念,这样可以防止方法名冲突,代码如下:

  1. //命名空间
  2. var AJUN = {};
  3. AJUN.Examples = {};
  4. AJUN.Examples.User=function(){
  5. this.setName = function(newName){
  6. name = newName;
  7. };
  8. this.getName = function(){
  9. return name;
  10. }
  11. this.getAge = function(){
  12. return age;
  13. };
  14. this.setAge = function(newAge){
  15. age = newAge;
  16. };
  17. }
  18. var user = new AJUN.Examples.User();
  19. user.setName('ajun');
  20. alert(user.getName());

补充:其实用javascript还可以实现类继承等,会用到prototype属性,后续会补上。。。。

http://blog.csdn.net/ajun_studio/article/details/6837182

JavaScript OOP 思想的更多相关文章

  1. javascript大神修炼记(7)——OOP思想(多态)

    读者朋友们大家好,今天我们就接着前面的内容讲,前面我们已经讲到了继承,今天我们就来讲OOP目前最后一个体现,那就是多态,因为javascript语言的灵活性,所以我们是没有办法使用接口的,所以这也给j ...

  2. javascript大神修炼记(6)——OOP思想(继承)

    读者朋友们大家好,我们今天这一讲就接着前面的封装继续讲解,今天就是在前面内容上面的升级,OOP思想中的继承,我们就先来解释一下继承到底是什么意思,我们在什么地方会用到继续. 继承就是,后代继续祖先的一 ...

  3. javascript大神修炼记(5)——OOP思想(封装)

    读者朋友们好,前面我们已经讲解了有关javascript的基础,从今天的内容开始,我们就要开始讲有关封装的内容了,这里,我们就一点一点地接触到OOP(面向对象编程)了,如果作为一门语言使用的程序员连O ...

  4. OOP思想

    OOP思想 读者朋友们大家好,我们今天这一讲就接着前面的封装继续讲解,今天就是在前面内容上面的升级,OOP思想中的继承,我们就先来解释一下继承到底是什么意思,我们在什么地方会用到继续. 继承就是,后代 ...

  5. JQuery OOP 及 OOP思想的简易理解

    在项目维护的时候,看到通篇的function实际上是非常费(痛)劲(苦),个人对于前端也不是特别熟悉,就想着JQuery能否也建立OOP的写法? 目的便于日后代码维护管理,就算不为了自己,日后交接后也 ...

  6. 拖拽系列二、利用JS面向对象OOP思想实现拖拽封装

    接着上一篇拖拽系列一.JavaScript实现简单的拖拽效果这一篇博客将接着对上一节实现代码利用JS面向对象(OOP)思维对上一节代码进行封装; 使其模块化.避免全局函数污染.方便后期维护和调用:写到 ...

  7. JavaScript OOP 之 this指向

    今天给大家分享一个JavaScript OOP中关于分辨this指向对象的小技巧,很实用呦! 我们先来看一段代码: 大家能判断出func();和obj.func();这两句的this指向吗? 首先,我 ...

  8. 使用JavaScript OOP特性搭建Web应用

    最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 J ...

  9. OOP思想应该怎样来理解?

    https://blog.csdn.net/qq157962718/article/details/50990154 https://www.cnblogs.com/xiaosongluffy/p/5 ...

随机推荐

  1. Package inputenc Error: Unicode char \u8: not set up for use with LaTeX.

    用TexStudio编辑文档时,不知是多加了空格还是啥,总是提示如下错误: Package inputenc Error: Unicode char \u8: not set up for use w ...

  2. Python异常记录

    1.常用异常名 AttributeError 调用不存在的方法引发的异常. EOFError 遇到文件末尾引发的异常. ImportError 导入模块出错引发的异常. IndexError 列表越界 ...

  3. Building nginx from Sources(从源代码安装nginx)

    Building nginx from Sources(从源代码安装nginx) The build is configured using the configure command.  安装用配置 ...

  4. [转]简析 IOS 程序图标的设计

    表现形态**** 在有限的空间里表达出相对应的信息,在IOS 程序图标设计中,直观是第一个解决的问题,不应该出现大多繁琐的修饰,当然还要有很好的视觉表现力,使用户可以更容易理解此应用的实际作用,更轻松 ...

  5. Slideout吐槽

    前言: 今天有点事,只尝试做一个侧边栏.SlideOut一个侧边栏,对着github,ReadMe看,并尝试着写了.还不错,关键是当与bootstrap一起时,什么效果都没了, 这是什么情况,明天想再 ...

  6. MySql 5.6 慢查询

    网上都巨坑 最后在官网找到了开启方法 原来是配置文件改了 Updated example for 2015 MySQL 5.6: slow_query_log = 1slow_query_log_fi ...

  7. 编译python3

    安装环境 yum install gcc yum install zlib-devel yum install make 下载python版本 wget http://www.python.org/f ...

  8. [cocos2d-js]chipmunk例子(二)

    ; ; ; ; <<; var NOT_GRABABLE_MASK = ~GRABABLE_MASK_BIT; var MainLayer = cc.Layer.extend({ _bal ...

  9. c++一些问题总结

    <span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...

  10. POJ 1160Post Office

    POJ 1160    Post Office 我不知道优化,我只知道最暴力的方法,O(V^3),居然100ms不到的过了 设DP[i][j][k]表示考虑前i个小镇,放了j个邮局,最后一个邮局的所在 ...