`
rainsilence
  • 浏览: 159008 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Javascript 继承机制和构造方法链实现(原)

阅读更多
(function(){
	Rs = {version: 1.0};
	
	Rs.extend = function(target, params) {
		
		target = target || {};
		
		for (var prop in params) {
			target[prop] = params[prop];
		}	
		return target;
	};
	
	Rs.Class = function() {
		// 构造体
		var Class = function() {
			this.initialize.apply(this, arguments);
		};
		
		var extended = {};
		
		var parent, superclass;
		
		for (var index = 0, len = arguments.length; index < len; index++) {
			
			if (typeof arguments[index] == "function") {
				
				// 如果有父类
				if (index == 0 && len > 1) {
					
					var initialize = arguments[index].prototype.initialize;
					
					arguments[index].prototype.initialize = function() {};
					
					extended = new arguments[index]();
					
					if (initialize === undefined) {
						delete arguments[index].prototype.initialize;
					} else {
						arguments[index].prototype.initialize = initialize;
					}
					
					superclass = arguments[index];
					continue;
				}
				
				parent = arguments[index].prototype;
			} else {
				// 如果为顶层基类
				parent = arguments[index];
			}
			
			Rs.extend(extended, parent);
		}
		Class.prototype = extended;
		Class.superclass = superclass;
		return Class;
	};
})();

var Animal = Rs.Class({
    initialize: function(name){
	
        this.name = name;  
    },
      
    showName: function(){    
        alert(this.name);    
    }  
});

var Cat = Rs.Class(Animal, {
    initialize: function(name) {
        // 调用父类构造函数  
        Cat.superclass.prototype.initialize.call(this, name);  
    }  
});  
  
var BlackCat = Rs.Class(Cat, {
    initialize: function(name, type) {  
                // 调用父类构造函数  
        BlackCat.superclass.prototype.initialize.call(this, name);  
        this.type = type;  
    },  
    showType: function() {  
        alert(this.type);  
    },  
    showName: function() {  
        alert(this.name + ":" + this.type);  
    }  
});  


var cat = new Cat("cat name");

// 继承方法  
cat.showName();  

// true  
alert(cat instanceof Animal);  
  
// true  
alert(cat instanceof Cat);  
  
// false  
alert(cat instanceof BlackCat);  
  
var blackCat = new BlackCat("123", "black");  
  
// 方法重写  
blackCat.showName();  
  
// 自有方法  
blackCat.showType();  
  
// true  
alert(blackCat instanceof Animal);  
  
// true  
alert(blackCat instanceof Cat);  
  
// true  
alert(blackCat instanceof BlackCat);


大家可能会问,Rs是什么,Rs就是Rainsilence的简称。^-^

以上实现了继承,多态,重载,和完整的构造体方法链。
7
2
分享到:
评论

相关推荐

    基于JavaScript实现继承机制之构造函数+原型链混合方式的使用详解

    构造函数、原型实现继承的缺陷 ...这种方式同样适用于继承机制,用对象冒充继承构造函数的属性,用原型链继承 prototype 对象的方法。用这两种方式重写前面的例子,代码如下: 代码如下:function ClassA(sColo

    基于JavaScript实现继承机制之构造函数方法对象冒充的使用详解

    这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的。这意味着所有的继承细节并非完全由解释程序处理。作为开发者,你有权决定最适用的继承方式。最原始的继承实现方式就是对象冒充,下面着重...

    Javascript 继承机制的实现

    创建的子类将继承超类的所有属性和方法,包括构造函数及方法的实现。记住,所有属性和方法都是公用的,因此子类可直接访问这些方法。子类还可添加超类中没有的新属性和方法,也可以覆盖超类中的属性和方法。 4.2.1 ...

    Javascript中类式继承和原型式继承的实现方法和区别之处

    但是javascript中并没有定义这种实现的机制,如果一个类需要继承另一个类,这个继承过程需要程序员自己通过编码来实现。 一、类式继承的实现 1、创建一个类的方式: //定义类的构造函数 function Person(name

    JavaScript 继承机制的实现(待续)

    1.对象冒充 原理:构造函数使用this关键字给所有属性和方法赋值(即采用类声明的构造函数方式)。 因为构造函数只是一个函数,所以可使ClassA的构造函数成为ClassB的方法,然后调用它。ClassB就会收到ClassA的构造...

    JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现

    在JavaScript中继承方式的实现方式主要有以下五种:对象冒充、call()、apply()、原型链、混合方式。 下面分别介绍。 对象冒充 原理:构造函数使用this关键字给所有属性和方法赋值。因为构造函数只是一个函数,所以...

    JavaScript中实现继承的三种方式和实例

    javascript虽然是一门面向对象的语言,但是它的继承机制从一开始设计的时候就不同于传统的其他面向对象语言,是基于原型的继承机制,但是在这种机制下,继承依然有一些不同的实现方式。 方法一:类式继承 所谓的类式...

    详解JavaScript基于面向对象之继承

    一、面相对象继承机制  这个实例使用UML很好的解释了继承机制。  说明继承机制最简单的方式是,利用一个经典的例子就是几何形状。实际上,几何形状只有两种,即椭圆形(是圆形的)和多边形(具有一定数量的边)。圆是...

    JavaScript原型继承之基础机制分析

    对象从该原型中继承属性和方法。 1、构造函数 利用构造函数,可以简单地创建对象。构造函数内的 this 关键字指向实例对象本身: 代码如下: function People(name){ this.name = name; } 使用 new 运算符和构造函数...

    跟我学习javascript的prototype原型和原型链

    每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型...

    Javascript数组操作高级心得整理

    3. 继承机制实现 27 (1) 继承的方式 27 (2) 继承方式1—对象冒充 27 (3) 继承方式2—call()方法与apply()方法 28  call()方法 28  apply()方法 28 (4) 继承方式3—原型链(prototype chaining) 29 (5) 继承方式...

    全面分析JavaScript 继承

    ES6之前,JavaScript并没有继承这一现有的机制。 ES5的继承方式 类式继承 //声明父类 function Father(){ this.fatherVal = 'father'; } //为父类添加共有方法 Father.prototype.getFatherValue = function(){ ...

    JavaScript 常见的继承方式汇总

     在ECMAscript中描述了原型链的概念,并将原型链作为实现继承的主要方法,其基本思想就是利用原型让一个引用类型继承另一个引用类型的属性和方法。 构造函数和原型还有实例之间的关系:  每个构造函数都有一个原型...

    javascript面向对象三大特征之继承实例详解

    在JavaScript中的继承的实质就是子代可以拥有父代公开的一些属性和方法,在js编程时,我们一般将相同的属性放到父类中,然后在子类定义自己独特的属性,这样的好处是减少代码重复。继承是面向对象的基础,是代码重用...

    在JavaScript中实现类的方式探讨

    在 javascript 中有很多方式来创建对象,所以创建对象的方式使用起来非常灵活。那么,到底哪一种方式是最恰当的对象创建方式呢?...它没有类继承机制,但是可以通过原型(prototype)实现继承。 现在看起来,

    深入理解Angular.JS中的Scope继承

    本文结合AngularJS Scope的实现以及相关资料谈谈原型继承机制。下面来看看详细的介绍: 基本原理 在JavaScript中,每创建一个构造函数(constructor),就会同时给该函数生成一个指向原型对象的属性prototype。每个...

    JavaScript从数组的indexOf()深入之Object的Property机制

    在JavaScript中,数组可以使用Array构造函数来创建,或使用[]快速创建,这也是首选的方法。数组是继承自Object的原型,并且他对typeof没有特殊的返回值,他只返回’object’。 js中,可以说万物皆对象(object),一个...

    千方百计笔试题大全

    46、java 中实现多态的机制是什么? 12 47、在java 中一个类被声明为final 类型,表示了什么意思? 12 48、下面哪些类可以被继承? 12 49、指出下面程序的运行结果: 【基础】 13 52、关于内部类: 13 53、数据类型...

    java面试宝典

    46、java 中实现多态的机制是什么? 12 47、在java 中一个类被声明为final 类型,表示了什么意思? 12 48、下面哪些类可以被继承? 12 49、指出下面程序的运行结果: 【基础】 13 52、关于内部类: 13 53、数据类型...

Global site tag (gtag.js) - Google Analytics