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