借这篇文章理清一下自己的思路,同时也希望能给和我同样一知半解的同学理清一下思路。引发思考来自于我犯的一个错误,错误代码是这样的:

1 var o = {
2     ...
3 }
4 var obj = new o();

结果不用说,当然是报错的。遗憾的是我以前一直以为var o = { }是定义了一个叫做o的类。然后自己理了一下。得出一下结论:

var o = {}; 等价于 var o = new Object(); 但不等价于 var o = function(){};

第一二种形式 o是一个对象,Object类的对象。第三种形式 o是一个function,更重要的是o是一个类。

1 var o = {};
2 o.oField = "oField";

等价于

1 var o = {
2     oField : "oField"
3 }

那问题是:对象上怎么可以直接定义属性呢?

由于o是Object类的对象,所以o.prototype是undefined 所以不能这样 o.prototype.oField = ...

另外,在思考过程中,我写了两段测试代码,一并贴上。可以算是个笔记吧。

01 //定义类
02 var Engin = function(){};
03  
04 //实例属性
05 Engin.prototype.objectField = "objectField";
06  
07 //类属性(静态域)
08 Engin.classField = "classField";
09  
10 //实例方法
11 Engin.prototype.objectMethod = function(){
12     document.write("objectMethod is called<br/>");
13 }
14 //类方法(静态方法)
15 Engin.classMethod = function(){
16     document.write("classMethod is called<br/>");
17 }
18  
19 //调用实例方法
20 new Engin().objectMethod();
21  
22 //调用类方法
23 Engin.classMethod();
24  
25 document.write(new Engin().objectField + "<br/>");
26 document.write(Engin.classField + "<br/>");
27  
28 //只能遍历出类属性和类方法
29 //怎么遍历出实例属性和实例方法呢?
30 document.write("使用for in 遍历Engin对象===============================<br/>");
31 for(var in Engin){
32     document.write(o+"<br/>");
33 }
34 document.write("=======================================================<br/>");
01 //定义父类Parent,并在父类里定义了一个属性pField和一个方法pMethod
02 var Parent = function(){
03     this.pField = "pField";
04     this.pMethod = function(){
05         document.write("pMethod is called<br/>");
06     }
07 };
08 //定义父类静态属性
09 Parent.staticPField = "staticPField";
10 //定义父类静态方法
11 Parent.staticPMethod = function(){
12     document.write("staticPMethod is called<br/>");
13 }
14 //定义子类Child,并在子类里定义了一个属性cField和一个方法cMethod
15 var Child = function(){
16     this.cField = "cField";//实例属性
17     this.cMethod = function(){//实例方法
18         document.write("cMethod is called<br/>");
19     }
20 };
21 //定义子类静态属性
22 Child.staticCField = "staticCField";
23 //定义子类静态方法
24 Child.staticCMethod = function(){
25     document.write("staticCMethod is called<br/>");
26 }
27 //指定Child继承自Parent
28 Child.prototype =  new Parent();
29  
30 //创建子类对象
31 var childObj = new Child();
32 document.write(childObj.pField+"<br/>");//子类对象访问父类实例属性
33 //document.write(childObj.staticPField+"<br/>");//子类对象不能访问父类静态属性
34 childObj.pMethod();//子类对象调用父类实例方法
35 //childObj.staticPMethod();//子类对象不能调用父类静态方法
36 document.write(childObj.cField+"<br/>");//子类对象访问自己的实例属性
37 document.write(Child.staticCField+"<br/>");//必须使用类名访问自己的静态属性
38 childObj.cMethod();//子类对象调用自己的实例方法
39 Child.staticCMethod();//必须使用类名来调用自己的静态方法

理清一下JavaScript面向对象思路的更多相关文章

  1. javascript面向对象系列第三篇——实现继承的3种形式

    × 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...

  2. Javascript面向对象(封装、继承)

    Javascript 面向对象编程(一):封装 作者:阮一峰 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程( ...

  3. 深入理解Javascript面向对象编程

    深入理解Javascript面向对象编程 阅读目录 一:理解构造函数原型(prototype)机制 二:理解原型域链的概念 三:理解原型继承机制 四:理解使用类继承(继承的更好的方案) 五:建议使用封 ...

  4. 转:javascript面向对象编程

    作者: 阮一峰 日期: 2010年5月17日 学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学 ...

  5. JavaScript面向对象旅程(下)

    JavaScript面向对象旅程 剪不断,理还乱,是离愁. 前面已经提到过新语言开发的两个步骤,分别是:一.定义基本的数据类型,完善结构化编程语言的设计:二.为函数类型绑定this的概念,好在对象的方 ...

  6. JavaScript面向对象(三)——继承与闭包、JS实现继承的三种方式

      前  言 JRedu 在之前的两篇博客中,我们详细探讨了JavaScript OOP中的各种知识点(JS OOP基础与JS 中This指向详解 . 成员属性.静态属性.原型属性与JS原型链).今天 ...

  7. (三)Javascript面向对象编程:非构造函数的继承

    Javascript面向对象编程:非构造函数的继承   这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现"继承". 今天是最后一个部分,介绍不使 ...

  8. (二)Javascript面向对象编程:构造函数的继承

    Javascript面向对象编程:构造函数的继承   这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承 ...

  9. Javascript面向对象编程(三):非构造函数的继承(对象的深拷贝与浅拷贝)

    Javascript面向对象编程(三):非构造函数的继承   作者: 阮一峰 日期: 2010年5月24日 这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现&quo ...

随机推荐

  1. WEB页面常用基本控件测试用例

    一.树控件的测试外观操作 1)项目中的所有树是否风格一致 2)树结构的默认状态是怎样的.比如默认树是否是展开,是展开几级?  是否有默认的焦点? 默认值是什么?展开的节点图标和颜色? 2.执行操作 1 ...

  2. JMeter自学笔记3-创建自己的第一个测试用例

    一.写在前面的话: 上篇我们已经认识了JMeter的图形界面,大家应该都是很懵的.那么这篇,我们将学习使用JMeter创建第一个属于自己测试用例. 二.创建自己的第一个测试用例: 1.新建一个Thre ...

  3. TPO-12 C1 Revise a Hemingway paper

    TPO-12 C1 Revise a Hemingway paper 第 1 段 1.Listen to a conversation between a student and a professo ...

  4. Unity编辑器 - 使用GL绘制控件

    Unity编辑器 - 使用GL绘制控件 控件较为复杂时,可能造成界面卡顿,在EditorGUI中也可以灵活使用GL绘制来提升性能. 以绘制线段为例: using UnityEngine; using ...

  5. Mongo DB Java操作

    1.首先下载Mongo DB java 驱动 2.操作Mongo 增删改查 package com.sjjy.mongo; import java.util.ArrayList;import java ...

  6. Laxcus大数据管理系统2.0(6)- 第四章 数据计算

    第四章 数据计算 Laxcus所有数据计算工作都是通过网络实施.相较于集中计算,在网络间进行的数据计算更适合处理那些数据量大.复杂的.耗时长的计算任务.能够实施网络计算的前提是数据可以被分割,就是把一 ...

  7. [递推+矩阵快速幂]Codeforces 1117D - Magic Gems

    传送门:Educational Codeforces Round 60 – D   题意: 给定N,M(n <1e18,m <= 100) 一个magic gem可以分裂成M个普通的gem ...

  8. 11.24Daily Scrum(4)

    人员 任务分配完成情况 明天任务分配 王皓南 实现网页上视频浏览的功能.研究相关的代码和功能.1007 实现视频浏览的功能 申开亮 实现网页上视频浏览的功能.研究相关的代码和功能.1008 实现视频浏 ...

  9. 团队第一次作业 ——404 Note Found 团队

    如果记忆是一个罐头的话,我希望这一罐罐头不会过期----<重庆森林> 404 Note Found Team 如果记忆是一个备忘录的话,别说了,它不会过期----<404 Note ...

  10. 什么是POJO模式

    1.     什么是POJO POJO的名称有多种,pure old java object .plain ordinary java object 等. 按照Martin Fowler的解释是“Pl ...