js如何封装函数,求最简单的例子 js里能否像c#或者java里的类一样,把很多方法封装在这个类里面,然后调用这个方法的时候可以用class.Fun();这样的形式来调用。求一个最简单的完整的例子(麻雀虽小五脏俱全)。万分感谢!时刻关注! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 function Person() { this.name = "jee"; this.age = 25; this.getName = function() { return this.name; }}var person = new Person();alert(person.age);alert(person.getName()); function Person() { this.name = "jee"; this.age = 25; this.getName = function() { return this.name; }}var person = new Person();alert(person.age);alert(person.getName());1楼的兄弟的例子不错 我想就他的例子稍微深入的讲下 改正一些小的缺陷首先 构造函数中这段代码this.name = "jee";this.age = 25;这样的话 稍显死板 因为每一个对象new出来 name 和 age 都是 “jee” 25那么改进后代码function Person(name,age) { this.name = name; this.age = age; this.getName = function() { return this.name; }}var p1 = new Person("xiaoqiang",1);alert(p1.age); //1alert(p1.name);//xiaoqiangalert(p1.getName());//xiaoqiangvar p2 = new Person("zhangsan",2);alert(p2.age);//2alert(p2.name);//zhangsanalert(p2.getName());//zhangsan那么 接下来 再看 这个方法this.getName = function() { return this.name; }这样写是没问题的 但是 有一点缺陷 就是 每个对象都维护相同的方法实例 而其实它们可以共享此方法 而不必每个对象都生成此示例 在java语言中 面向对象的思想中 有一条 “继承” 既然此方法对于每个对象来说是公用的 那么可以在它的父类中实现 在javascript中继承 是基于原型对象的继承 在原型对象中实现此方法,那么每个对象调用此方法时 首先查看自己是否有此方法 如果有 调用自己的方法 如果没有 去原型对象中查询 调用原型对象的方法 是不是和java中的继承差不多呢?呵呵 看下 改造后的代码function Person(name,age) { this.name = name; this.age = age;}Person.prototype.getName = function(){ return this.name;}var p1 = new Person("xiaoqiang",1);alert(p1.age); //1alert(p1.name);//xiaoqiangalert(p1.getName());//xiaoqiangvar p2 = new Person("zhangsan",2);alert(p2.age);//2alert(p2.name);//zhangsanalert(p2.getName());//zhangsan另外 还有对象字面量的形式构造对象var p1 ={ name:"zhangsan", age:1, getName:function(){ return this.name; } };alert(p1.name);//zhangsanalert(p1.age);//1alert(p1.getName());//zhangsan在这里鉴于篇幅 就不多讲了如果lz想详细了解面向对象的javascript编程 可以建议你看下这两本书:<<javascript 权威指南>>,<<javascript高级程序设计>> 楼上看得和讲得都挺细。TO楼主:JS是很灵活的语言,同时,根据你要处理的具体情况,也有不同的相对更好的解决方法,因此不能希望拿任何一个模式来以不变应万变。关键还是要学通原理。 js区的朋友真是别具一格 太太太太太热情了认真的看过了大家的回复,也谢谢wodeguozili推荐的书。现在我总结一下,封装可以有两种方法:1.以类的形式封装2.对象字面量的形式构造对象(wodeguozili在4楼说的,我在百度上没有搜到更多的信息,可能搜索关键字不对)第一种很好理解,但是第二种不太理解,请问这两种有什么区别?谢谢! JS没有严格的类定义,从字面上就能看得到的!没有各种类作用域关键字(PUBLIC,PRIVATE,PROTECTED等)!但是却有类似的功能,楼主可以看看类定义的方式,有工厂,动态,原型等!一般都是根据实际需要灵活定制的,并没有规定哪种是正规与不正规!符合需要就好! var p1 ={ name:"zhangsan", age:1, getName:function(){ return this.name; } };alert(p1.name);//zhangsanalert(p1.age);//1alert(p1.getName());//zhangsan就象这个例子,一看就应该懂吧。前者是: var name="zhangsan"; function getName(){ }而这个是: name:"zhangsan", getName:function(){ } function class(a){ this.property1 = a;};class.prototype = { method1:function(){ alert('我是第一个方法') }, method2:function(a){ this.property2 = a; }}var newClass = new class("32456456");newClass.method1(); # theforever# (碧海情天-好友满,要加看我资料):你完全没有理解我的意思。第二种方法我会用,我只是不知道专业术语怎么解释。我今天悟出了点道理,不知道对不对。请大家指点:这种写法其实是声明了一个数组,但是这个数组的成员是以json格式定义的,并且这个成员既可以是字段、也可以是函数。 不是生命了数组,而是就是对象格式也不是json。你姑且可以理解为字典 悟透js中的对象封装,楼主想要深入学习的话可以看看下面的代码,不过要注意灵活运用!//语法甘露:var object = //定义小写的object 基本类,用于实现最基础的方法等{isA: function(aType) //一个判断类与类之间以及对象与类之间关系的基础方法{var self = this;while(self){if (self == aType)return true;self = self.Type;};return false;}};19function Class(aBaseClass, aClassDefine) //创建类的函数,用于声明类及继承关系{function class_() //创建类的临时函数壳{this.Type = aBaseClass; //我们给每一个类约定一个Type 属性,引用其继承的类for(var member in aClassDefine)this[member] = aClassDefine[member]; //复制类的全部定义到当前创建的类};class_.prototype = aBaseClass;return new class_();};function New(aClass, aParams) //创建对象的函数,用于任意类的对象创建{function new_() //创建对象的临时函数壳{this.Type = aClass; //我们也给每一个对象约定一个Type 属性,据此可以访问到对象所属的类if (aClass.Create)aClass.Create.apply(this, aParams); //我们约定所有类的构造函数都叫Create,这和DELPHI 比较相似};new_.prototype = aClass;return new new_();};//语法甘露的应用效果:var Person = Class(object, //派生至object 基本类{Create: function(name, age){this.name = name;this.age = age;},SayHello: function(){alert("Hello, I'm " + this.name + ", " + this.age + " years old.");}});var Employee = Class(Person, //派生至Person 类,是不是和一般对象语言很相似?{Create: function(name, age, salary){Person.Create.call(this, name, age); //调用基类的构造函数this.salary = salary;},20ShowMeTheMoney: function(){alert(this.name + " $" + this.salary);}});var BillGates = New(Person, ["Bill Gates", 53]);var SteveJobs = New(Employee, ["Steve Jobs", 53, 1234]);BillGates.SayHello();SteveJobs.SayHello();SteveJobs.ShowMeTheMoney();var LittleBill = New(BillGates.Type, ["Little Bill", 6]); //根据BillGate 的类型创建LittleBillLittleBill.SayHello();alert(BillGates.isA(Person)); //truealert(BillGates.isA(Employee)); //falsealert(SteveJobs.isA(Person)); //truealert(Person.isA(Employee)); //falsealert(Employee.isA(Person)); //true var obj={"yanzhen":function(){alert('');}}调用obj.yanzhen(); 我是搞c#的 编程基础还行看这份文档毫无难度http://wenku.baidu.com/view/b7c3132ded630b1c59eeb52d.html但是这篇文档里没有我上面有疑问的那种方式,我想搜一下资料,根本不知道用什么关键字搜。 c#也只是一门语言,虽然里面囊括了几种编程范式,但是我相信做C#的童鞋很多都对此不是很了解。看文档也要选择性看啊~对吧如果LZ对此感兴趣,我到建议LZ看点书,比如john resig的书,或者博客也挺好的~~~ 我不知道你说的编程范式是指什么 我在c#里从来没听到过 可能是指设计模式设计模式思想在不同的语言里是互通的的 这方面我很有信心 我不属于你说的那些c#童鞋我最近开始搞js 想设计一个通用类 里面都是一些方法:比如检查字符串是不是邮箱、是不是邮编、是不是手机号等等,因为这些方法是可以通用的,所以把他们封装在一起。并且,在调用里面的一个方法时,不必先new一个对象,而是直接用 "class"."function()" 的形式调用。刚好我上面的那种方式符合我的预期,所以想把这种方式搞搞清楚。再说句题外话c#和java是面向对象的top了吧js虽说比他们两个要灵活 但是这个“灵活”到底是优势还是劣势呢 听说下一代的js开始考虑class public private这些关键字了 不知道是不是真的 javascript是一门语言。如果想写一个库了,还对语言的特性不了解,你觉得靠谱吗编程范式和设计模式不是一回事。FP/OOP/OP==什么叫面向对象中的TOP呢 说到面向对象编程语言 大家会说c#和java 不会说c++和js 另外,我都说的很清楚了,我不知道这种设计的专业术语是什么,所以让大家给我一个专业术语,我好去百度搜索资料。 JS可比C#和JAVA难多了.就是因为它的灵活,换句话说,难捉摸.要说学过的语言种类,26个字母开头的,我学过大半.只有VC和JS,是觉得最难的.VC的难,难在它的组织结构上,是一种令人讨厌的难.而JS的难,是难在它的过于灵活上,如烟雾一样,难有固定形迹,但这是一种令人觉得总是值得玩味的难.所以我说我不敢去总结JS,也信不过任何一个非大师级别的人对JS的总结.要想学透JS,我想最好是有JS解释器的源码,至少能知道JS解释器的行为结果,这样才能从根本上了解JS.比如类的构造方式,种类虽多,但最后JS解释器总是会把它们转换为一种内部形式.也就是说,知道起点和终点,中间的过程就能想得通了.反过来,知道了终点,那么其它的起点是否可以到达终点,也就容易判断,容易走通了. 大哥 你干嘛老揪着“总结”不放 你看看前后语境我是总结大家的回复 不是总结自己对js的理解 我要是有总结的水平 我也不来问大家了我觉得js的“灵活”是最难的最令人讨厌的 它没有给你固定的定义举个例子,如果你要运货,c#java给你货车;你想全家去户外野餐,c#java给你suv。而js呢?不管你是什么用途,它都只是给你一辆车,然后你按照自己的需求去改装。更关键的是,从外面开,你分不清楚这辆车到底是干什么的?另外,js虽说灵活 但是这个“灵活”到底是优势还是劣势呢 听说下一代的js开始考虑class public private这些关键字了 不知道是不是真的谢谢 我觉得是好事阿,我更喜欢js编程,相对于java来说 一个js问题 不是高手不要进-求flash广告轮播分析 JS去除空格问题 <script> </script> 200分求一正则表达式 iframe自适应调整高度问题 在线等 急! 想在IE上做一个简单的FTP上传、下载功能,请各位指点!!! 当输入框中文字过长时,怎样把最后的文字显示????? appendChild怎么添加样式 怎么找出JS里面的广告代码 删除。找不到。 input不能改变值 不失去焦点 javascript程序执行顺序
this.name = "jee";
this.age = 25;
this.getName = function() {
return this.name;
}
}var person = new Person();
alert(person.age);
alert(person.getName());
function Person() {
this.name = "jee";
this.age = 25;
this.getName = function() {
return this.name;
}
}var person = new Person();
alert(person.age);
alert(person.getName());
1楼的兄弟的例子不错 我想就他的例子稍微深入的讲下 改正一些小的缺陷
首先
构造函数中这段代码
this.name = "jee";
this.age = 25;
这样的话 稍显死板 因为每一个对象new出来 name 和 age 都是 “jee” 25
那么改进后代码
function Person(name,age) {
this.name = name;
this.age = age;
this.getName = function() {
return this.name;
}
}var p1 = new Person("xiaoqiang",1);
alert(p1.age); //1
alert(p1.name);//xiaoqiang
alert(p1.getName());//xiaoqiangvar p2 = new Person("zhangsan",2);
alert(p2.age);//2
alert(p2.name);//zhangsan
alert(p2.getName());//zhangsan
那么 接下来 再看 这个方法
this.getName = function() {
return this.name;
}
这样写是没问题的 但是 有一点缺陷 就是 每个对象都维护相同的方法实例 而其实它们可以共享此方法 而不必每个对象都生成此示例 在java语言中 面向对象的思想中 有一条 “继承” 既然此方法对于每个对象来说是公用的 那么可以在它的父类中实现 在javascript中继承 是基于原型对象的继承 在原型对象中实现此方法,那么每个对象调用此方法时 首先查看自己是否有此方法 如果有 调用自己的方法 如果没有 去原型对象中查询 调用原型对象的方法 是不是和java中的继承差不多呢?呵呵 看下 改造后的代码
function Person(name,age) {
this.name = name;
this.age = age;
}
Person.prototype.getName = function(){
return this.name;
}
var p1 = new Person("xiaoqiang",1);
alert(p1.age); //1
alert(p1.name);//xiaoqiang
alert(p1.getName());//xiaoqiangvar p2 = new Person("zhangsan",2);
alert(p2.age);//2
alert(p2.name);//zhangsan
alert(p2.getName());//zhangsan另外 还有对象字面量的形式构造对象
var p1 ={
name:"zhangsan",
age:1,
getName:function(){
return this.name;
}
};
alert(p1.name);//zhangsan
alert(p1.age);//1
alert(p1.getName());//zhangsan在这里鉴于篇幅 就不多讲了
如果lz想详细了解面向对象的javascript编程 可以建议你看下这两本书:<<javascript 权威指南>>,<<javascript高级程序设计>>
现在我总结一下,封装可以有两种方法:
1.以类的形式封装
2.对象字面量的形式构造对象(wodeguozili在4楼说的,我在百度上没有搜到更多的信息,可能搜索关键字不对)第一种很好理解,但是第二种不太理解,请问这两种有什么区别?
谢谢!
name:"zhangsan",
age:1,
getName:function(){
return this.name;
}
};
alert(p1.name);//zhangsan
alert(p1.age);//1
alert(p1.getName());//zhangsan
就象这个例子,一看就应该懂吧。
前者是:
var name="zhangsan";
function getName(){
}而这个是:
name:"zhangsan",
getName:function(){
}
this.property1 = a;
};
class.prototype = {
method1:function(){
alert('我是第一个方法')
},
method2:function(a){
this.property2 = a;
}
}
var newClass = new class("32456456");
newClass.method1();
# (碧海情天-好友满,要加看我资料):你完全没有理解我的意思。第二种方法我会用,我只是不知道专业术语怎么解释。
我今天悟出了点道理,不知道对不对。请大家指点:这种写法其实是声明了一个数组,但是这个数组的成员是以json格式定义的,并且这个成员既可以是字段、也可以是函数。
格式也不是json。
你姑且可以理解为字典
var object = //定义小写的object 基本类,用于实现最基础的方法等
{
isA: function(aType) //一个判断类与类之间以及对象与类之间关系的基础方法
{
var self = this;
while(self)
{
if (self == aType)
return true;
self = self.Type;
};
return false;
}
};
19
function Class(aBaseClass, aClassDefine) //创建类的函数,用于声明类及继承关系
{
function class_() //创建类的临时函数壳
{
this.Type = aBaseClass; //我们给每一个类约定一个Type 属性,引用其继承的类
for(var member in aClassDefine)
this[member] = aClassDefine[member]; //复制类的全部定义到当前创建的类
};
class_.prototype = aBaseClass;
return new class_();
};
function New(aClass, aParams) //创建对象的函数,用于任意类的对象创建
{
function new_() //创建对象的临时函数壳
{
this.Type = aClass; //我们也给每一个对象约定一个Type 属性,据此可以访问到对象所属的类
if (aClass.Create)
aClass.Create.apply(this, aParams); //我们约定所有类的构造函数都叫Create,这和DELPHI 比较相
似
};
new_.prototype = aClass;
return new new_();
};
//语法甘露的应用效果:
var Person = Class(object, //派生至object 基本类
{
Create: function(name, age)
{
this.name = name;
this.age = age;
},
SayHello: function()
{
alert("Hello, I'm " + this.name + ", " + this.age + " years old.");
}
});
var Employee = Class(Person, //派生至Person 类,是不是和一般对象语言很相似?
{
Create: function(name, age, salary)
{
Person.Create.call(this, name, age); //调用基类的构造函数
this.salary = salary;
},
20
ShowMeTheMoney: function()
{
alert(this.name + " $" + this.salary);
}
});
var BillGates = New(Person, ["Bill Gates", 53]);
var SteveJobs = New(Employee, ["Steve Jobs", 53, 1234]);
BillGates.SayHello();
SteveJobs.SayHello();
SteveJobs.ShowMeTheMoney();
var LittleBill = New(BillGates.Type, ["Little Bill", 6]); //根据BillGate 的类型创建LittleBill
LittleBill.SayHello();
alert(BillGates.isA(Person)); //true
alert(BillGates.isA(Employee)); //false
alert(SteveJobs.isA(Person)); //true
alert(Person.isA(Employee)); //false
alert(Employee.isA(Person)); //true
"yanzhen":function(){
alert('');
}
}
调用
obj.yanzhen();
看这份文档毫无难度http://wenku.baidu.com/view/b7c3132ded630b1c59eeb52d.html
但是这篇文档里没有我上面有疑问的那种方式,我想搜一下资料,根本不知道用什么关键字搜。
看文档也要选择性看啊~对吧如果LZ对此感兴趣,我到建议LZ看点书,比如john resig的书,或者博客也挺好的~~~
设计模式思想在不同的语言里是互通的的 这方面我很有信心 我不属于你说的那些c#童鞋我最近开始搞js 想设计一个通用类 里面都是一些方法:比如检查字符串是不是邮箱、是不是邮编、是不是手机号等等,因为这些方法是可以通用的,所以把他们封装在一起。
并且,在调用里面的一个方法时,不必先new一个对象,而是直接用 "class"."function()" 的形式调用。
刚好我上面的那种方式符合我的预期,所以想把这种方式搞搞清楚。
再说句题外话
c#和java是面向对象的top了吧
js虽说比他们两个要灵活 但是这个“灵活”到底是优势还是劣势呢 听说下一代的js开始考虑class public private这些关键字了 不知道是不是真的
编程范式和设计模式不是一回事。
FP/OOP/OP==
什么叫面向对象中的TOP呢
另外,我都说的很清楚了,我不知道这种设计的专业术语是什么,所以让大家给我一个专业术语,我好去百度搜索资料。
比如类的构造方式,种类虽多,但最后JS解释器总是会把它们转换为一种内部形式.
也就是说,知道起点和终点,中间的过程就能想得通了.反过来,知道了终点,那么其它的起点是否可以到达终点,也就容易判断,容易走通了.
我是总结大家的回复 不是总结自己对js的理解 我要是有总结的水平 我也不来问大家了
我觉得js的“灵活”是最难的最令人讨厌的 它没有给你固定的定义
举个例子,如果你要运货,c#java给你货车;你想全家去户外野餐,c#java给你suv。
而js呢?不管你是什么用途,它都只是给你一辆车,然后你按照自己的需求去改装。更关键的是,从外面开,你分不清楚这辆车到底是干什么的?另外,js虽说灵活 但是这个“灵活”到底是优势还是劣势呢 听说下一代的js开始考虑class public private这些关键字了 不知道是不是真的谢谢