今天在图书馆看《Ajax企业级开发》这本书时,看到它关于javascript中继承的一些见解,觉得非常不错。并且提出了几点关于在编写javascript继承封装函数的方式时候应该达到的几个目标: 避免在原型阶段调用基类的构造函数。就是在子类实现继承的时候,避免在子类中调用了基类的构造函数来实现继承基类的属性。这点考虑是并无道理的,如果基类的构造函数中有关于DOM操作的执行代码,并且修改了页面的DOM结构,这就会失去了继承的意义了。 避免子类对父类方法的全局调用。就是避免在子类中直接使用基类的名称去调用基类的方法,这样造成对基类名称的依赖性过大,扩展性和维护性不佳。 允许调用基类方法和构造函数。 不要扩展Object.prototype属性。这个主要是避免增加Object类的方法,使得Object类越来越难操纵,尽量保持它的“纯净”,把对性能的影响效果降到最低。 确保不会严重影响性能。 上面罗列的五点,非常具有参考意义。虽然是一些细节问题,可是对于企业级的应用来说,有时候可能就是问题所在。在继承方面,Dean Edwards和Douglas Crockford也做了比较详细的叙述:《http://dean.edwards.name/weblog/2006/03/base/》,《Classical Inheritance in JavaScript》,同时,John Resig也做了相关的叙述:《Simple JavaScript Inheritance》,都非常经典而且具有代表意义。 书中也根据上面的五点,给出了一个extend函数示例: [javascript] var extend=function(subClass,baseClass){ var … 了解更多
2010年3月13日的那个中午,踏上火车,回到学校,回到图书馆了,离别了有段日子了,也甚是思念在图书馆的点点滴滴。 “在图书馆翻书看的时候无意中看到一个比较有意思的名词:元编程。自由百科全书的定义如下:编写一些程序来提前生成一些数据或代码供运行时使用,用来生成这些数据信息或者代码的程序称为元程序,编写这种程序就称为元编程。” “接着它又说啦:在Javascript中实践元编程,其中所谓的元程序就是function,而供运行时使用的数据或代码就是Function或function引出的一系列扩展。因为作为一个function,既可以直接执行,有可以充分利用function代码体的上下文,如享受apply或call等方法带来的便利,而作为一个构造方法使用,则受到比较大的限制,缺少了function的灵活性。” 暂且不说它是否说的对与不对,先看它举例的代码再说: [javascript] //createConstructor function createConstructor(fn){ var p=fn.prototype; function func(){} func.prototype=p; func.prototype.constructor=p.constructor; //定义新对象的构造 func.prototype.a="a"; func.prototype.show=function(){alert(this.a);} } //createFunction var … 了解更多
步骤: 1.创建一个新对象 2.有选择性的定义私有变量和方法,就是函数中通过var声明的普通变量 3.给这个新对象扩充方法 4.返回这个新对象 原理:在继承的时候,在子类中首先获得父类定义的新对象,之后在这个新对象的基础上扩充其他的方法或者重定义父类的方法. 从而达到始终都在操作同一个对象来实现“伪继承”。 [javascript] Function.prototype.method=function(name,fn){ if(!this.prototype[name]){ this.prototype[name]=fn; } return this; } var mammal = function(spec){ var … 了解更多
javascrpt里继承的方式很多种,有类式继承和原型继承(权威的解释:Prototypal Inheritance in JavaScript Classical Inheritance in JavaScript)。js没有像java那种只要通过一个extends关键字来声明继承的方式,它的实现方式是比较丑陋的,所以封装这个继承过程就显得尤为重要了。 下面我来说明一种链式封装继承的方式,这种方式需要扩展鼎鼎大名的method和inherits扩展方法。method是douglas crockford通过扩展Function类来方便声明方法从而出名。 [javascript] //首先来实现method扩展方法: Function.prototype.method=function(name,fn){ if(!this.prototype.name){ //验证是否已经存在该方法 this.prototype[name]=fn; } return this; } … 了解更多
Javascript里面没有类、继承这样的概念,但是并不代表Javascript不能够实现“继承”。Javascript是一种基于原型链的解释语言,当然也是一种面向对象的语言。既然它面向对象,就不得不需要使用OOP这样的编程方式来编写良好的Javascript代码,编写OOP方式的代码的好处就在于易封装、广重用、易维护等等。Javascript里的知识繁多,现在来简单的讲一下我对Javascript继承的理解。 首先,我们先写一个简单的“父类”Person: [javascript] var Person=function(n){ this.name=n; } Person.prototype={ //这里Person.prototype给赋值了一个对象,有意思 getName:function(){ return this.name; } } [/javascript] 我相信上面的代码是Front-End都能看懂的。上面的代码有意思的地方是Person.prototype给赋值了一个对象。好,下面来简单实现一个“子类”Student: [javascript] var Student=function(n,a){ Person.call(this,n); … 了解更多