`
basil1292
  • 浏览: 9432 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

prototype中继承的问题?

阅读更多
最近在学习prototype.js代码,想利用其中的继承来学习一下javascript中的oo思想。碰见到了一些问题,如下

/*
 * 第一种方法,不使用prototype的继承
 * 这是以前在学习继承时使用的继承方法,
 */
function d(ui){
	if(!ui){
		return;
	}
	this.param1 = document.createElement(ui);
}

function e(ui){
	if(!ui){
		return;
	}
	this.base = d;
	this.base(ui);
	this.param2 = document.createElement(ui);
}
e.prototype = new d();

function f(ui){
	if(!ui){
		
	}
	this.base = e;
	this.base(ui);
}
f.prototype = new e();

var e1 = new e("div");
var e2= new e("div");
var f1 = new f("div");
var f2 = new f("div");
//能够拿到不同的param1对象
alert(e1.param1 ==e2.param1); //返回false
alert(f1.param2 == f2.param2);//返回false

/*
 * 第二种方法,使用prototype继承
 */
 
var a = Class.create();
a.prototype = {
	initialize:function(ui ){
		this.param1 = document.createElement(ui);
	}
}

var b = Class.create();
b.prototype = Object.extend(new a(),{
	initialize:function(ui){
		this.param2 = document.createElement(ui);
	}
})

var c = Class.create();
c.prototype = Object.extend(new b(),{
	initialize:function(param){
	}
})

var b1 = new b("div");
var b2= new b("div");
var c1 = new c("div");
var c2 = new c("div");
//这里本意是每一个对象都能拿到自己的一个param1的属性
//但是这里拿到的是同一个引用
alert(b1.param1 == b2.param1);//return true
alert(c1.param2 == c2.param2);//return true


我的问题是我想用prototype的方法实现第一种代码的实现,在继承后,子类能拿到自己的在父类中param1对象,但是却发生了第二种代码的情况,这应该是由prototype中继承机制导致的,prototype中继承代码如下:

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}
//继承实现时如:
b.prototype = Object.extend(new a(),{}}


我参照ajax.base中形式改进了第二种方法如下:
/*
*第三种方法
*/
var a = Class.create();
a.prototype = {
	initialize:function(param){
		this.init(param);
	},
	init:function(param){
		this.param1 = document.createElement(ui);
	}
}

var b = Class.create();
b.prototype = Object.extend(new a(),{
	initialize:function(param){
		this.init(param);
		this.param2 = document.createElement(ui);
	}
})

var c = Class.create();
c.prototype = Object.extend(new b(),{
	initialize:function(param){
		//this.init(param);
	}
})
var b1 = new b("div");
var b2= new b("div");
var c1 = new c("div");
var c2 = new c("div");

alert(b1.param1 == b2.param1);//return false
alert(c1.param2 == c2.param2);//return true


第三种方法我用一个init方法在每个对象中给param1赋值,这样每个子类能拿到不同的param1对象,但是这样多重继承后设置子类的属性时非常的不方便,请问有什么改进的方法吗?
分享到:
评论
10 楼 woweiwokuang 2008-05-25  
值得学习.
9 楼 csf177 2008-05-21  
basil1292 写道

那js到底是基于对象还是面向对象的呢?

JS自己的语言标准说的很清楚是面向对象 就在正文第一页(PDF第13页) 原文是这样写的
ECMAScript is an object-oriented programming language for performing computations and manipulating computational objects within a host environment.

基于对象这个词我就没有查到是什么意思,也不清楚用它来形容JS是什么意思。"JS是基于对象的,而非面向对象的"这个说法我没有在任何权威资料中发现(当然如果发现就太奇怪了,有什么资料会直接否定语言的标准文档呢)。
8 楼 basil1292 2008-05-21  
jianfeng008cn 写道
prototype 的确没有 调用父类的显式引用,但是你的例子说的和你最后提到的解决方法根本不是一回事啊!
按照你的 例子 的确子类实例获得的父类属性值都是一样,但是这个是很符合情理的!!!目前比较理想的集成方案你可以参考extjs2

刚学习prototype.js,自己想写一点东西熟悉一下类库的使用,本以为prototype.js应该能完成如super()这种任务的。

笨笨狗 写道
1.6版的已经可以在子类方法中调用父类同名方法了,只要你在声明子类方法的时候第一个参数为$super。
谁再说Prototype的继承实现弱,我就跟他急,呵呵……

看来你是很喜欢prototype啊,可惜我用的还是1.5,跟不上脚步啊!

csf177 写道
sp42 写道
通过复制属性的方法来“继承”,不是严格意义上的继承。
只能说在“基于对象”的思维下简单操作而已。
更传统的OO,正如jianfeng008cn所说,参考ext
我个人推荐yui,因为ext都是从yui学习的,--ext是yui门下的学生啊

拜托老大们不要再说"基于对象"了 JS是面向对象的好不好(反正ECMA262是这么说的)
这么无知的话是谁最先说的啊(应该是某个老外) 不认识动态对象模型就造出一个"基于对象"来煞有介事的解释么?
我找了n久也没找到哪个权威资料这么说
现在真的是流毒甚广 国内的JS书上几乎口径完全一致了 连sp42老大都信了啊

那js到底是基于对象还是面向对象的呢?
7 楼 csf177 2008-05-21  
sp42 写道
通过复制属性的方法来“继承”,不是严格意义上的继承。
只能说在“基于对象”的思维下简单操作而已。
更传统的OO,正如jianfeng008cn所说,参考ext
我个人推荐yui,因为ext都是从yui学习的,--ext是yui门下的学生啊

拜托老大们不要再说"基于对象"了 JS是面向对象的好不好(反正ECMA262是这么说的)
这么无知的话是谁最先说的啊(应该是某个老外) 不认识动态对象模型就造出一个"基于对象"来煞有介事的解释么?
我找了n久也没找到哪个权威资料这么说
现在真的是流毒甚广 国内的JS书上几乎口径完全一致了 连sp42老大都信了啊
6 楼 sp42 2008-05-21  
通过复制属性的方法来“继承”,不是严格意义上的继承。
只能说在“基于对象”的思维下简单操作而已。
更传统的OO,正如jianfeng008cn所说,参考ext
我个人推荐yui,因为ext都是从yui学习的,--ext是yui门下的学生啊
5 楼 csf177 2008-05-21  
不明白为啥有人喜欢java里面丑陋至极的super
更不明白为啥prototype和moo喜欢在一个面向对象的语言里"实现"面向对象
在一个动态语言里搞静态语言的那一套很好玩?

完全不理解prototype的"类"非要用户把方法定义在一个对象上 然后抄给klass的prototype
4 楼 笨笨狗 2008-05-20  
1.6版的已经可以在子类方法中调用父类同名方法了,只要你在声明子类方法的时候第一个参数为$super。
谁再说Prototype的继承实现弱,我就跟他急,呵呵……
3 楼 jianfeng008cn 2008-05-19  
prototype 的确没有 调用父类的显式引用,但是你的例子说的和你最后提到的解决方法根本不是一回事啊!
按照你的 例子 的确子类实例获得的父类属性值都是一样,但是这个是很符合情理的!!!目前比较理想的集成方案你可以参考extjs2
2 楼 basil1292 2008-05-15  
我翻阅了一些文章,在fins的文章主题:我为什么选择mootools,抛弃了prototype. (mootools与prototype 核心代码分析)中很好的说明了这个问题,prototype.js的继承实在有些薄弱..
var Animal = new Class({   
    initialize: function(age){   
        this.age = age;   
    }   
});   
var Cat = Animal.extend({   
    initialize: function(name, age){   
        this.parent(age); //will call the previous initialize;   
        this.name = name;   
    }   
});  




看那个parent() !!!!
通过moo的Class.extend实现的继承提供一个关键的方法 parent().
使用他你可以调用父类中的同名方法,好像java里的super一样.
这个示例已经可以说明一切了.
1 楼 jianfeng008cn 2008-05-15  
var c = Class.create();   
c.prototype = Object.extend(new b(),{   
    initialize:function(param){   
        //this.init(param);   
    }   
})   


你的第二种方法和第三种方法的initialize 都是空函数 参数都是null 当然相等了!

相关推荐

    javascript中类和继承(代码示例+prototype.js)

    本文将深入探讨JavaScript中的类和继承,并结合`prototype.js`文件中的示例进行解析。 ### 类的概念与模拟 在JavaScript中,我们通常使用函数来模拟类的行为。一个函数可以看作是一个类的定义,通过`new`关键字来...

    js遍历属性 以及 js prototype 和继承

    在JavaScript中,遍历属性、理解`prototype`和掌握继承机制是编程中不可或缺的基本技能。本文将深入探讨这些概念,并通过实例来加深理解。 首先,让我们来看如何遍历JavaScript对象的属性。JavaScript提供了多种...

    详解JavaScript中基于原型prototype的继承特性_.docx

    JavaScript中的原型(prototype)机制是实现继承的一种核心方式。由于JavaScript是一种基于原型的面向对象语言,它不支持传统的类(class)概念,因此其继承机制显得与众不同。在JavaScript中,对象可以直接从另一个...

    Prototype中英文手册

    标题"Prototype中英文手册"指出,我们关注的是一个名为"Prototype"的JavaScript库的文档集合,这个文档提供了中英文两种语言版本,帮助开发者理解和使用该库。 描述进一步细化了内容,包括"Prototype中文手册"和...

    javascript的prototype继承

    在JavaScript中,每个函数都有一个`prototype`属性,这个属性是一个对象,它的作用是当试图访问一个对象的属性时,如果该对象自身没有这个属性,就会去查找它的原型对象,以此类推,直到找到属性或者到达原型链的...

    prototype 中文开发手册和chm帮助文档

    在DOM操作方面,Prototype提供了一套强大的DOM操作接口,如Element.extend()、Element.update()、Element.insert()等,这些方法使得在JavaScript中操作DOM元素变得简单易懂。同时,Prototype的Event模块允许我们方便...

    Prototype 中文chm教程 Prototype 中文电子图书 Prototype中文帮助文档下载

    "Prototype中文帮助文档"则包含了详细的API参考,是解决实际问题的好助手。 六、下载与应用 你可以通过提供的下载链接获取"Prototype.js 中文chm教程"和"Prototype.js 中文电子图书",安装后在本地查阅。同时,不要...

    prototype中文帮助文档

    用户可以通过搜索、索引或目录浏览找到所需的信息,快速解决编程中遇到的问题。 总的来说,Prototype.js 是一个强大的JavaScript工具库,它通过丰富的API和优雅的设计,降低了Web开发的复杂性,提高了开发效率。...

    Prototype中文帮助文档

    Prototype 提供了一套完整的面向对象机制,使得在JavaScript中实现类和继承变得更加容易。通过`Class.create()`方法,我们可以创建新的类,而`Object.extend()`和`Prototype.extend()`则用于实现类的继承。此外,`...

    prototype 1.6中文手册 chm+prototype 1.6.js源码 最新版

    Prototype JavaScript 框架是Web开发中的一个关键工具,它为JavaScript编程提供了许多实用的类库函数和设计模式。这个“Prototype 1.6中文手册 chm+prototype 1.6.js源码 最新版”正是面向希望深入学习和掌握...

    Prototype&Prototype中文手册

    Prototype是JavaScript库中的一个关键工具,它为Web开发者提供了丰富的功能和便利,使得在JavaScript中进行AJAX(异步JavaScript和XML)编程变得更加简单高效。这个"Prototype&Prototype中文手册"压缩包包含了对...

    JS中的prototype

    JavaScript中的`prototype`是语言核心概念之一,它在对象创建、继承和方法共享中起着关键作用。在JavaScript中,每个对象都有一个`prototype`属性,这个属性引用了一个对象,通常用于实现对象间的继承。理解`...

    prototype.js中文手册

    2. **Ajax功能**:Prototype.js 强化了AJAX操作,通过`Ajax.Request` 和 `Ajax.Updater` 类,开发者可以轻松实现异步数据交换,无需关心浏览器兼容性问题。 3. **对象扩展**:Prototype.js 基于JavaScript原型链...

    Javascript中的prototype与继承

    JavaScript中的prototype与继承是该语言面向对象编程的核心概念之一。prototype是JavaScript中实现原型继承的基础,它允许一个对象从另一个对象上继承属性和方法。通过了解prototype与继承的工作机制,开发者能够...

    prototype学习笔记

    在JavaScript中,`prototype`是一个核心概念,它关乎对象继承和函数实例化。这篇"prototype学习笔记"可能探讨了如何利用原型链实现面向对象编程的关键技术。以下是对这个主题的详细解析。 首先,理解`prototype`的...

    Javascript中 关于prototype属性实现继承的原理图

    首先,我们需要明确一点,JavaScript是一种基于原型的语言,不同于基于类的语言如Java或C++,JavaScript中的继承主要是通过原型链(prototype chain)来实现的。在JavaScript中,每个对象都有一个内部链接指向另一个...

    Prototype-1.6.0 中文版\英文版\Prototype.js

    1. **类与对象继承**:Prototype.js引入了基于原型的类系统,允许开发者创建类并实现继承。这使得JavaScript代码可以采用面向对象的方式编写,增强了代码的可读性和可维护性。 2. **DOM操作**:Prototype提供了强大...

    prototype中文手册及API

    5. **模拟类和继承**:通过`Class.create`和`Object.extend`等函数,Prototype 实现了JavaScript中的类和继承概念。 6. **Ajax组件**:Prototype 还包含了一些预定义的UI组件,如`Autocompleter`和`Slider`,这些...

    构造函数定义对象+prototype继承的实现.html

    构造函数定义对象+prototype继承的实现,含CSS样式

Global site tag (gtag.js) - Google Analytics