<<JavaScript语言精髓与编程实践>>非常基础又深入介绍了javascript, 推荐去看看

我这里主要讨论javascript对向对象编程;

一.对原型支持定义方法:

// 方法1
//在构造器中写this实例引用
//使用构造器创建对象实例”
function MyObject_1() {
     this.<propertyName1> = …; 
     this.<propertyName2> = …; 
}

// 方法2
//在构造器中直接返回对象实例
//使用构造器创建对象实例”) 
function MyObject_2() {
  var data = this; 
  return {
      // (使用直接量声明或new()构造一个实例)… 
  }
}

// 方法3
//修改原型
// 原型修改”)
function MyObject_3() { }
MyObject3.prototype.<propertyName> = …; 

 // 方法4
//重写原型
//原型继承”) 
function MyObject_4() { }
MyObject4.prototype = {   // 使用直接量声明一个实例… }

 // 方法5
//继承原型 
// 原型继承”) 
function MyObject_5() { }
// 使用new()构造一个实例
 MyObject5.prototype = new Constructor_for_ParentClass();

这5种方法中 前两种方法根本没有利用JavaScript的“原型继承”特性 它们基本上是“类继承对象系统”的翻版。方法3和方法4虽然操作了原型 但利用的是“对象成员可以被修改”这种动态语言特性 因此 对于类继承树的构建来讲 事实上也没有“继承”特性。 从“修改对象成员”这个特性上来讲 方法5继承原型可以看做方法4的一种扩展方式 但也只有它才是JavaScript的原型继承性质的准确应用。这样看来 “构建原型继承关系”的唯一方

这5种方法补充说明:

function Base() { }

function Children() { }

Children.prototype = new Base();

var obj = new Children();
console.log(obj instanceof Children);   //true
console.log(obj instanceof Base);   //true
console.log(obj instanceof Object);   //true
//只有支持原型定义, instanceof才可以真正起作用

 

 二,类实体化时并没有创建一份新内存空间, 而是引用定义:

function ClassTest() {
    
}
ClassTest.prototype.a = "a";
ClassTest.prototype.obj = { pro1: "pro1", pro2: "pro2" };

var objA = new ClassTest();
var objB = new ClassTest();
objA.a = "aA"
objB.a = "aB"
console.log([objA.a, objB.a]);
//结果:["aA", "aB"], 很正常
objA.obj.pro1 = "pro1A"
console.log([objA.obj.pro1, objB.obj.pro1]);
//结果:["pro1A", "pro1A"]
//证明objA和objB实体化后引用同一空间, 这点很重要
//这点以后要对类的分离

 

三.类只有继承基本特性, 没有私有,保护等特性(但可以用闭包特性模拟私有特性, 但能力有限)

function Base() {
    //初始
    this.name = "baseName";
}
Base.prototype.name = "name";

(function () {
    var Children = window.Children = function(){
         this.name = "childrenName";
   };
    Children.prototype = new Base();

    var priName = "myName";
    Children.prototype.getPriname  = function(){
        return priName;
    };
})();

var obj = new Children();
console.log(obj.getPriname());
//结果:"myName"

 Ext, Mootools等都有parent之类支持, 但对类定义到实体化过程要几次分离操作, 还要caller,callee等属性的支持, 但javascript严格模式, 是不能用这些属性的.

在这我还是见意用ClassFunction.prototype.function.apply来实现吧.没必要一个parent来实现.

 

 下次有时间, 研究一个类的定义框架

支类的扩展, 对javascript只有扩展, DefineClass().Extend(Base)

支类的分组定义,  解决私有等问题DefineClass().DefineGroup("privateClass", {priName:"name"})

事件机制定义,DefineClass().Event({onInit:fuction(callback){}})

内存释放管理机制, new MyClass().dispose()//加强对闭包和内存泄漏问题管理

类与DOM的连接, 如果DOM删除, 类自己释放, DefineClass().Init(function(){ this.linkToDom("#div1"); })

 

 

posted on 2013-01-27 18:09  winpzs  阅读(475)  评论(0编辑  收藏  举报