借这篇文章理清一下自己的思路,同时也希望能给和我同样一知半解的同学理清一下思路。引发思考来自于我犯的一个错误,错误代码是这样的:
结果不用说,当然是报错的。遗憾的是我以前一直以为var o = { }是定义了一个叫做o的类。然后自己理了一下。得出一下结论:
var o = {}; 等价于 var o = new Object(); 但不等价于 var o = function(){};
第一二种形式 o是一个对象,Object类的对象。第三种形式 o是一个function,更重要的是o是一个类。
等价于
那问题是:对象上怎么可以直接定义属性呢?
由于o是Object类的对象,所以o.prototype是undefined 所以不能这样 o.prototype.oField = ...
另外,在思考过程中,我写了两段测试代码,一并贴上。可以算是个笔记吧。
02 |
var Engin = function(){}; |
05 |
Engin.prototype.objectField = "objectField"; |
08 |
Engin.classField = "classField"; |
11 |
Engin.prototype.objectMethod = function(){ |
12 |
document.write("objectMethod is called<br/>"); |
15 |
Engin.classMethod = function(){ |
16 |
document.write("classMethod is called<br/>"); |
20 |
new Engin().objectMethod(); |
25 |
document.write(new Engin().objectField + "<br/>"); |
26 |
document.write(Engin.classField + "<br/>"); |
30 |
document.write("使用for in 遍历Engin对象===============================<br/>"); |
32 |
document.write(o+"<br/>"); |
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/>"); |
09 |
Parent.staticPField = "staticPField"; |
11 |
Parent.staticPMethod = function(){ |
12 |
document.write("staticPMethod is called<br/>"); |
14 |
//定义子类Child,并在子类里定义了一个属性cField和一个方法cMethod |
15 |
var Child = function(){ |
16 |
this.cField = "cField";//实例属性 |
17 |
this.cMethod = function(){//实例方法 |
18 |
document.write("cMethod is called<br/>"); |
22 |
Child.staticCField = "staticCField"; |
24 |
Child.staticCMethod = function(){ |
25 |
document.write("staticCMethod is called<br/>"); |
28 |
Child.prototype = new Parent(); |
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面向对象系列第三篇——实现继承的3种形式
× 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...
- Javascript面向对象(封装、继承)
Javascript 面向对象编程(一):封装 作者:阮一峰 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程( ...
- 深入理解Javascript面向对象编程
深入理解Javascript面向对象编程 阅读目录 一:理解构造函数原型(prototype)机制 二:理解原型域链的概念 三:理解原型继承机制 四:理解使用类继承(继承的更好的方案) 五:建议使用封 ...
- 转:javascript面向对象编程
作者: 阮一峰 日期: 2010年5月17日 学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学 ...
- JavaScript面向对象旅程(下)
JavaScript面向对象旅程 剪不断,理还乱,是离愁. 前面已经提到过新语言开发的两个步骤,分别是:一.定义基本的数据类型,完善结构化编程语言的设计:二.为函数类型绑定this的概念,好在对象的方 ...
- JavaScript面向对象(三)——继承与闭包、JS实现继承的三种方式
前 言 JRedu 在之前的两篇博客中,我们详细探讨了JavaScript OOP中的各种知识点(JS OOP基础与JS 中This指向详解 . 成员属性.静态属性.原型属性与JS原型链).今天 ...
- (三)Javascript面向对象编程:非构造函数的继承
Javascript面向对象编程:非构造函数的继承 这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现"继承". 今天是最后一个部分,介绍不使 ...
- (二)Javascript面向对象编程:构造函数的继承
Javascript面向对象编程:构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承 ...
- Javascript面向对象编程(三):非构造函数的继承(对象的深拷贝与浅拷贝)
Javascript面向对象编程(三):非构造函数的继承 作者: 阮一峰 日期: 2010年5月24日 这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现&quo ...
随机推荐
- Python入门编程中的变量、字符串以及数据类型
//2018.10.10 字符串与变量 1. 在输出语句中如果需要出现单引号或者双引号,可以使用转义符号\,它可以将其中的歧义错误解释化解,使得输出正常: 2. 对于python的任何变量都需要进行赋 ...
- yarn logs -applicationId命令java版本简单实现
import java.io.DataInputStream; import java.io.EOFException; import java.io.FileNotFoundException; i ...
- Paper Reading - Learning to Evaluate Image Captioning ( CVPR 2018 ) ★
Link of the Paper: https://arxiv.org/abs/1806.06422 Innovations: The authors propose a novel learnin ...
- js单行写一个评级组件
单行写一个评级组件:"★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate); -----------------------------------分隔符- ...
- mysql source 恢复 sql数据time_zone报错 已解决
报了一些变量的错误,类似于"time_zone" 等错误 解决: [root@iz8vbilqy0q9v8tds55bqzz conf.d]# vi /etc/my.cnf [my ...
- Python中package的导入语法
在Python中,一个目录被称为一个package.import和from语法除了导入module文件之外,还可以导入package,语法如下: # import语法 import dir1.dir2 ...
- Python中对变量是否为None的判断
三种主要的写法有: 第一种:if X is None; 第二种:if not X: 当X为None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()这 ...
- Java package和import语句
Java中的package和import语句 如果你想让其他人访问你的类,你一定要把你写的类放到正确的子目录下. 在Java里,对于位于包中的类是这样管理的: Java编译器把包对应于文件系统的目录管 ...
- android在程序崩溃时Catch异常并处理
Android系统的"程序异常退出",给应用的用户体验造成不良影响.为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理.通过Th ...
- Microsoft.Practices.EnterpriseLibrary
项目中使用了Microsoft.Practices.EnterpriseLibrary这个东西,根据名字猜测和微软有关系(可以翻译为:微软实践企业库). 看到了引入了两个命名空间: using Mic ...