借这篇文章理清一下自己的思路,同时也希望能给和我同样一知半解的同学理清一下思路。

引发思考来自于我犯的一个错误,错误代码是这样的:

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/>");

相关文章:

  • 2022-01-27
  • 2022-02-10
  • 2021-12-07
  • 2021-11-01
  • 2022-01-27
  • 2022-12-23
  • 2022-03-03
  • 2021-09-11
猜你喜欢
  • 2022-12-23
  • 2021-08-28
  • 2021-10-11
  • 2022-02-27
  • 2022-12-23
  • 2021-09-11
  • 2021-10-28
相关资源
相似解决方案