//继承
//实现singlaton
//可以调用基类函数
//JavaScript通过构造函数和原型的方式模拟实现了类的功能。
var Class = (function(){
//IE不会遍历几个特殊属性:"constructor", "toString", "valueOf"
var IS_DONTENUM_BUGGY = void function(){
for (var p in { toString: 1}) return false;
return true;
}();
function create(options){
var options = options || {}, uniqueInstance = null;
//判定是否需要实现单例
var singleton = !!options.singleton;
delete options.singleton;
//父类
var superclass = options.inherit || {};
delete options.inherit;
function klass(){
if (!singleton) this.init.apply(this, arguments);
}
//添加类方法
$U.extend(klass, Class.Methods);
//是否继承
if ($U.isFunction(superclass)) {
var bridge = function(){};
bridge.prototype = superclass.prototype;
klass.prototype = new bridge;
klass.superclass = superclass;
}
//添加原型方法
klass.addMethods(options);
if (!klass.prototype.init)
klass.prototype.init = function(){
};
//修正constructor
klass.prototype.constructor = klass;
//__proto__是什么?我们在这里简单地说下。每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性时,如果
//这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有自己的__proto__,于是就这样
//一直找下去,也就是我们平时所说的原型链的概念。
//按照标准,__proto__是不对外公开的,也就是说是个私有属性,但是Firefox的引擎将他暴露了出来成为了一个共有的属性,
//我们可以对外访问和设置。
//修复IE与Opera中的第二条原型链
if (!klass.prototype.__proto__) klass.prototype.__proto__ = klass.prototype;
//处理函数:如果singleton模式,则private constructor
return singleton ? {
getInstance: function(){
if (!uniqueInstance) {// Instantiate only if the instance doesn't exist.
uniqueInstance = new klass;
uniqueInstance.init.apply(uniqueInstance, arguments);
}
return uniqueInstance;
}
} : klass;
}
function addMethods(source){
var ancestor = this.superclass && this.superclass.prototype, properties = $U.keys(source);
//处理IE不能遍历的特殊属性。
if (IS_DONTENUM_BUGGY) {
if (source.toString != Object.prototype.toString)
properties.push("toString");
if (source.valueOf != Object.prototype.valueOf)
properties.push("valueOf");
}
for (var i = 0, length = properties.length; i < length; i++) {
var property = properties[i], value = source[property];
//在C#中,如果子类有意隐藏基类成员,使用关键字"new"
//使用base关键字显示调用基类构造函数
//这这里约定如果子类方法第一个参数是“$super”,则调用父类的方法.
if (ancestor && $U.isFunction(value) && (value.argumentNames()[0] === "$super")) {
var method = value;
//var f = (function(m){ return function(){ return ancestor[m].apply(this, arguments)}})(property)
//f.wrap(method)
//F.prototype[name] = (function(name, fn) {
// return function() {
// var that = this;
// $super = function() {
// return baseClass.prototype[name].apply(that, arguments);
// };
// return fn.apply(this, Array.prototype.concat.apply($super, arguments));
// };
//})(name, prop[name]);
//总之,实现把基类函数作为子函数的第一个参数,以此调用父函数。
value = ancestor[property].wrap(method);
value.valueOf = method.valueOf.bind(method);
// 因为我们改变了函数体,所以重新定义函数的toString方法
// 这样用户调用函数的toString方法时,返回的是原始的函数定义体
value.toString = method.toString.bind(method);
}
this.prototype[property] = value;
}
return this;
}
return {
create: create,
Methods: {
addMethods: addMethods
}
};
})()
//继承
//实现singlaton
var F = function(){
};
F.prototype.getInstance = function(){
var instance = null;
return function(){
if (!instance)
instance = new this;
return instance;
};
}();
分享到:
相关推荐
Struts2的核心功能包括动作调度、请求处理、结果渲染、验证逻辑以及插件体系等,极大地简化了开发者的工作。 在描述中的"Struts2安装配置包",通常包含了运行Struts2应用所需的JAR文件,这些文件主要分为以下几类:...
### 《10步走进JavaScript...通过以上十个步骤的学习,《10步走进JavaScript》不仅能够帮助读者建立起坚实的JavaScript基础知识体系,还能够培养良好的编程习惯和技术素养,为成为一名优秀的前端开发者打下坚实的基础。
JavaScript,又被称为JS,是一种广泛应用于网页和网络应用的脚本语言,主要在客户端运行,为用户提供动态交互体验。作为互联网的重要组成部分,JavaScript是前端开发的基石,它能够操作HTML、CSS、处理用户输入、与...
5. **类(Class)和继承**:ES6引入了类的概念,虽然其底层仍然是基于原型的,但语法上更接近面向对象的语言,简化了构造函数和原型链的使用。同时,通过`extends`关键字实现继承,`super`关键字用于调用父类的方法...
effect.js的源码清晰地展示了其内部结构和机制,包括动画效果的继承体系、变化函数的实现以及事件处理。通过阅读源码,开发者可以更深入地理解其工作原理,以便进行更高级的定制和优化。 总之,scriptaculous的...
JavaScript是一种基于原型(prototype)的继承体系,与其他基于类(class)的语言如Java或C++的继承体系有所不同。在JavaScript中,继承是通过原型链实现的,原型链是对象属性和方法查找的路径。 首先,需要明确几...
js.class库是JavaScript中的一个面向对象编程工具,它模仿了Java和C++的类体系结构,提供了类、继承、构造函数等概念。使用js.class可以更容易地创建和管理对象,实现更加复杂的逻辑和设计模式。 Proton粒子引擎是...
这本书详细深入地探讨了JavaScript的各个方面,为开发者提供了全面且权威的知识体系。 1. **变量、数据类型与作用域** - JavaScript中的变量可以动态声明,并使用`var`、`let`和`const`关键字。 - 数据类型包括...
JavaScript,又被称为JS,是一种广泛应用于网页和网络应用的脚本语言,主要在客户端运行,为用户提供动态交互体验。作为互联网技术的重要组成部分,JavaScript的知识体系庞大且深入,涵盖了许多方面。以下将根据提供...
本"前端XMind汇总"是一个集大成的知识体系,包含了大量的个人实践和总结,涉及JavaScript、Node.js、Vue.js以及React.js等多个关键领域的核心概念和技术。以下是这些关键知识点的详细阐述: 1. JavaScript(JS): ...
这意味着抽象类在继承体系中扮演着严格的父类角色,限制了类的多继承性。 - 抽象类提供了代码复用的机会,当多个子类有共同的属性或行为时,可以将这些共享的代码放入抽象类中。 2. 接口: - 接口只包含抽象方法...
以上只是JavaScript知识体系的一部分,实际上,JavaScript还有许多高级特性,如Proxy、Reflect、Generator、WebAssembly等,不断推动着前端技术的发展。通过深入学习和实践,开发者可以利用JavaScript构建复杂的Web...
* 声明形式:[public] [abstract | final] class 类名称 [extends 父类名称] [implements 接口名称列表]{ 变量成员声明及初始化; 方法声明及方法体;} * 修饰符: + public:说明此类为公有类 + abstract:指明...
Java语言是软件开发领域广泛使用的编程...以上内容涵盖了Java基础、集合、多线程、异常处理、J2EE框架、XML解析等多个方面,是Java开发者必备的知识体系。通过深入理解和实践,可以提升Java编程能力并为面试做好准备。
- 数据库体系结构:表空间、段、区、块。 - SQL语句:查询(SELECT)、插入(INSERT)、更新(UPDATE)、删除(DELETE)。 - PL/SQL:过程式语言扩展,支持过程化逻辑处理。 2. **JDBC**: - JDBC驱动:加载、注册、...
本压缩包包含的"供参考学习的js体系文档"是一份全面介绍JavaScript基础知识、进阶技术和实践应用的资料集合,旨在帮助学习者构建坚实的JS知识体系。 文档可能涵盖了以下关键知识点: 1. **基础语法**:包括变量...
这些只是JavaScript庞大知识体系的一部分。通过深入学习和实践,开发者可以利用JavaScript实现丰富的网页功能和复杂的应用程序。如果你的"帕古卡达"项目涉及到JavaScript的具体应用,比如Web开发、Node.js服务端开发...
- **体系结构**:ISO/OSI七层模型或TCP/IP四层模型。 - **TCP/IP协议族**:包括传输控制协议(TCP)、互联网协议(IP)、用户数据报协议(UDP)等。 - **局域网(LAN)**:如以太网,通常在一个小区域内连接计算机。 - *...