理清一下JavaScript面向对象思路
2011-11-09 00:00
1136 查看
借这篇文章理清一下自己的思路,同时也希望能给和我同样一知半解的同学理清一下思路。引发思考来自于我犯的一个错误,错误代码是这样的:
结果不用说,当然是报错的。遗憾的是我以前一直以为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 = ...
另外,在思考过程中,我写了两段测试代码,一并贴上。可以算是个笔记吧。
var o = { ... } var obj = new o();
结果不用说,当然是报错的。遗憾的是我以前一直以为var o = { }是定义了一个叫做o的类。然后自己理了一下。得出一下结论:
var o = {}; 等价于 var o = new Object(); 但不等价于 var o = function(){};
第一二种形式 o是一个对象,Object类的对象。第三种形式 o是一个function,更重要的是o是一个类。
var o = {}; o.oField = "oField";
等价于
var o = { oField : "oField" }
那问题是:对象上怎么可以直接定义属性呢?
由于o是Object类的对象,所以o.prototype是undefined 所以不能这样 o.prototype.oField = ...
另外,在思考过程中,我写了两段测试代码,一并贴上。可以算是个笔记吧。
//定义类 var Engin = function(){}; //实例属性 Engin.prototype.objectField = "objectField"; //类属性(静态域) Engin.classField = "classField"; //实例方法 Engin.prototype.objectMethod = function(){ document.write("objectMethod is called<br/>"); } //类方法(静态方法) Engin.classMethod = function(){ document.write("classMethod is called<br/>"); } //调用实例方法 new Engin().objectMethod(); //调用类方法 Engin.classMethod(); document.write(new Engin().objectField + "<br/>"); document.write(Engin.classField + "<br/>"); //只能遍历出类属性和类方法 //怎么遍历出实例属性和实例方法呢? document.write("使用for in 遍历Engin对象===============================<br/>"); for(var o in Engin){ document.write(o+"<br/>"); } document.write("=======================================================<br/>");
//定义父类Parent,并在父类里定义了一个属性pField和一个方法pMethod var Parent = function(){ this.pField = "pField"; this.pMethod = function(){ document.write("pMethod is called<br/>"); } }; //定义父类静态属性 Parent.staticPField = "staticPField"; //定义父类静态方法 Parent.staticPMethod = function(){ document.write("staticPMethod is called<br/>"); } //定义子类Child,并在子类里定义了一个属性cField和一个方法cMethod var Child = function(){ this.cField = "cField";//实例属性 this.cMethod = function(){//实例方法 document.write("cMethod is called<br/>"); } }; //定义子类静态属性 Child.staticCField = "staticCField"; //定义子类静态方法 Child.staticCMethod = function(){ document.write("staticCMethod is called<br/>"); } //指定Child继承自Parent Child.prototype = new Parent(); //创建子类对象 var childObj = new Child(); document.write(childObj.pField+"<br/>");//子类对象访问父类实例属性 //document.write(childObj.staticPField+"<br/>");//子类对象不能访问父类静态属性 childObj.pMethod();//子类对象调用父类实例方法 //childObj.staticPMethod();//子类对象不能调用父类静态方法 document.write(childObj.cField+"<br/>");//子类对象访问自己的实例属性 document.write(Child.staticCField+"<br/>");//必须使用类名访问自己的静态属性 childObj.cMethod();//子类对象调用自己的实例方法 Child.staticCMethod();//必须使用类名来调用自己的静态方法
相关文章推荐
- 理清一下JavaScript面向对象思路
- 【javascript基础篇】——面向对象动态加载属性和方法
- javascript面向对象基础
- 深刻理解JavaScript基于原型的面向对象
- 老生常谈JavaScript面向对象基础与this指向问题
- javascript 面向对象开发一
- JavaScript面向对象笔记–原型
- javascript 面向对象基础
- JavaScript面向对象程序设计(3): 对象
- javascript面向对象精华编程(转)
- javascript 面向对象基础(二) 包装对象原型链
- Javascript中函数调用与this所指对象关系进行了一下总结
- javascript面向对象程序设计
- 用JavaScript面向对象画一个三角形
- JavaScript——面向对象初理解
- javascript:面向对象和常见内置对象及操作
- Javascript高级程序设计第二版第六章--面向对象程序设计(Object-Oriented Programming)简称OOP编程--笔记
- javascript 面向对象特性与编程实现
- JavaScript之----面向对象和原型
- JavaScript 面向对象整理笔记(一)