是否是允许该类的实例化对象能继承原型对象,如果不加prototype就不能继承原型对象中的函数?/*定义一个Test类,有A、B两个属性*/
function Test(a,b)
{
this.A = a;
this.B = b;
}/*定义一个函数sum,分别给属性A、B加上a、b的值*/
Test.sum(a,b) = function()
{
return new Test(this.A + a, this.B + b);
}Test.prototype.update(a,b) = function()
{
return new Test(a,b);
}var test = new Test(1,2);
test.sum(1,2);//test.A == 2,test.B == 4
test.update(1,2);//update对象不支持此属性或方法,意思就是不加prototype属性,实例化对象test就无法调用函数update??
function Test(a,b)
{
this.A = a;
this.B = b;
}/*定义一个函数sum,分别给属性A、B加上a、b的值*/
Test.sum(a,b) = function()
{
return new Test(this.A + a, this.B + b);
}Test.prototype.update(a,b) = function()
{
return new Test(a,b);
}var test = new Test(1,2);
test.sum(1,2);//test.A == 2,test.B == 4
test.update(1,2);//update对象不支持此属性或方法,意思就是不加prototype属性,实例化对象test就无法调用函数update??
解决方案 »
- JQuery插件中设置属性的变量
- ~~~怎么用javascript打开指定的文件夹?
- 求助!document.getElementById()
- windows2003企业版下如何安装脚本调试器?
- 5.3-5=0.29999999怎么解决
- 从不同的页面传递radio的checked
- javascrip里可以执行asp吗?
- 请问怎么把文字插到当前光标处
- 问题???弹出登陆窗口,登陆后怎样在另外一个页面打开登陆后的页面而登陆窗口自动关闭!
- 本人开发一系统,由于设计的疏忽,没有实现当用户在页面上改变field中的值后,提醒用户是否保存的功能。现在想请问各位高手,有无简便的
- 想问问这个JS做的效果是2D还是3D,希望得到比较权威的解释。
- js获取标签内元素的属性值
都知道如果对于java此类的语言,String 类已经是final类了,没办法扩展他的属性和方法.但是js就不一样拉.
他可以对类型进行属性和方法的扩展
比如说:
这里有我两个方法:
//删除数组中指定位置的项并返回新书组
Array.prototype.remove = remove;
function remove(num){
var numc=parseInt(num);
if(numc<0||numc>this.length){return;}
var new1=this.slice(0,numc)
var new2=this.slice(numc+1,this.length)
return new1.concat(new2)
}
var ss=[];
ss.push(1)
ss.push(2)
ss.push(3)
ss.push(4)
ss.push(5)
var dd=ss.remove(2)
var innr="";
for(var a=0;a<dd.length;a++){
innr+=dd[a]
}
alert(innr)//获取字符串中指定位置的字符
String.prototype.getIndexof=getidof;
function getidof(i){
var ii=parseInt(i)
if(ii<0 || ii>this.length){return "";}
return this.substr(i-1,i);
}var ss="123456";
alert(ss.getIndexof(2))//新的obj
function Zobj(){this.title="新的obj";}
Zobj.prototype.getTitle= function(){
return this.title;
}var obj= new Zobj();
alert(obj.getTitle())prototype 方法主要是用来扩展或重写已有对象的内置方法或属性
你如果新建一个对象也可以这样扩展它的属性和内置方法
function Test(a,b)
{
this.A = a;
this.B = b;
}
/*定义一个函数sum,分别给属性A、B加上a、b的值*/
Test.sum= function(a,b)
{
return new Test(this.A + a, this.B + b);
} Test.prototype.update = function(a,b)
{
return new Test(a,b);
}
function hee(){
var test = new Test(1,2);
test.sum(1,2);//test.A == 2,test.B == 4
test.update(1,2);
}
</script>
也就是
var A=function(){this.value=0;};
A.prototype.get=function(){return this.value;}如果var a=new A();
那实际上,a去找到了A的原型,将其中的方法做为构造a=function(){
....
.....
this["get"]=A.prototype["get"];
}每一个对象都有他的原形,string number Function ...
但是只有Function 有prototype这个属性.
此属性指向其原型.
(确切的说 a=c=b="123",并不代表a b c等于"123",
只是作为字面量的a b c都做为一个指针去指向"123"所在的内存空间)
大家可以用这么一种实例化的继承机制来实现继承.那就是上面说的,所有新对象都会去找原对象的原形,然后获取里面的方法.
{
return new Test(a,b);
}
这样写就相当与Test的private方法..Test.sum= function(a,b)
{
return new Test(this.A + a, this.B + b);
}
这样写的话为什么就不能调用呢??
他不能成为公共方法嘛??
直接执行Test.sum也是ok的啊!
Test.sum= function(a,b)
{
return new Test(this.A + a, this.B + b);
}
这句话的意义在那里呢??
function Test(){}//意思是声明一个名字为Test的方法.
等同于var Test=function(){}
Test代表了function(){}但却不是function(){}的本体.
也可以算是function(){}被实例出来的一个对象.
你可以测试一下for(var s in test)alert(s);也就是说Test.sum仅仅是对Test这个进行了扩展.而不是函数本身.
对于继承关系,新对象是继承的对象的本体而不是他的字面量.
静态方法应该在静态类中,并且不可操作非静态方法.他的用法是 类.方法
Test.sum=function(a,b)
{return new Test(this.A + a, this.B + b); }
里面的this.A 和this.B , LZ是想测试他们不是在操作Test的实例么?
这里面的this其实就是Test.sum,是不?怎么会有呢?
静态方法.直接单体就解决了.
这个prototype对象在运行时是不可见的,也就是说,定义了之后,你无法直接使用prototype对象。那么,prototype对象有什么用呢?它的作用,就是当你去调用一个对象的函数或属性时,javascript首先会在这个对象的定义中查找,如果找不到,
他就会去找这个对象的prototype对象有没有这个定义,如果还找不到,他又会去找prototype对象的prototype,一直到对象没有prototype定义为止。是不是和函数继承的目的很象?这就是javascript的原型继承特性。
但是我们也看出了,这种查找方式,效率非常之低,尤其在prototype链很长的情况下。javascript 2.0会对此有所改进。另外,prototype的定义方式也很奇怪,他必须以一个对象实例(而不是类)的形式,绑定到其他类上。记得吗?prototype是定义时的,同时又是对象。
也就是var t=new Test(1,2);
t.num(2,1)这本身是错的-----------------------
原因在于:
Test.sum和Test.prototype.sum的区别在于什么?
可以看一下16楼 .
Test.prototype.sum是Test的原型上附加sum方法
Test.sum是Test域附加sum方法
------------------------
首先,var Test=function(){....}等同function Test(){....}
他们都在他们所在的空间里声明了变量Test并将方法赋予他.
在这里有可能混淆的是认为Test就是function(){....},
所以理所应当的认为Test.sum =..等同于
function Test (){
this.sum=....//当然能被实例化调用}
事实完全不是这样.详细原因在11楼