asfman
android developer
posts - 90,  comments - 213,  trackbacks - 0

算了一下,还是来这里了 ^_^
无忧~~久违了…………贴一个原理的东东吧,

<SCRIPT LANGUAGE="JavaScript">
<!--
function Base( v_sBaseName )
{
 this.BaseName = v_sBaseName
 this.BaseMethod = BaseMethod;
 function BaseMethod( v_sStr )
 {
  alert("BaseName: " + this.BaseName + "\n" + "ExtendStr: " + v_sStr);
 }
}

function Son( v_sName )
{
 this.Name = v_sName
 this.BaseName = this.Name;
 this.Method = Method;
 function Method( v_sStr )
 {
  alert("Name: " + this.Name + "\n" + "ExtendStr: " + v_sStr);
 }
}

Son.prototype = new Base();

var O = new Son("初始化字串")

O.Method("Method附加字串");
O.BaseMethod("BaseMethod附加字串");
//-->
</SCRIPT>
当然,还可以通过以下几种不用“外挂”的方法…… 不过要求使用 Script5.5 才可以使用
比如 call 方法 和 apply方法…… 以下是使用 call 的方法来实现的
apply也差不多,只不过后面调用的参数是数组,详细可以自己参考MSScript5.6说明

Bencalie 还记得以前你跟我说call apply的使用方法么?这回这个答案算圆满了吧?
<SCRIPT LANGUAGE="JavaScript">
<!--
function Base( v_sBaseName )
{
 this.BaseName = v_sBaseName
 this.BaseMethod = BaseMethod;
 function BaseMethod( v_sStr )
 {
  alert("BaseName: " + this.BaseName + "\n" + "ExtendStr: " + v_sStr);
 }
}

function Son( v_sName )
{
 Base.call(this, v_sName)
 this.Name = v_sName
 this.Method = Method;
 function Method( v_sStr )
 {
  alert("Name: " + this.Name + "\n" + "ExtendStr: " + v_sStr);
 }
}

var O = new Son("初始化字串")

O.Method("Method附加字串");
O.BaseMethod("BaseMethod附加字串");
//-->
</SCRIPT>


注意观察所谓“继承对象”的 this.Prototype 这个变量(一开始我没注意看,以为是关键字……害我苦找资料)

this.Prototype = new JSObject(); // 注意:这可不是小写的prototype
this.Prototype.Speak = function(s){.......}
在构造对象后直接反馈 return this.Prototype 其实这个就是 JSPObject 对象,
并不是  JSHuman 对象,所以 var o = new JSHuman();
o 这个实例是无法访问 JSHuman 的成员的
//westfly原创
//不要问我有什么用,当你某一天需要用到时能想起来就可以了

function JSObject()
{
this._Name = "JSObject";

this.Set_Name = function(Value){
this._Name = Value;
}

this.Get_Name = function(){
return this._Name;
}
}

function JSHuman() // extends JSObject
{
this.Prototype = new JSObject(); // 注意:这可不是小写的prototype
this.Prototype.Speak = function(s){
alert(s);
}
return this.Prototype;
}

var o = new JSHuman();
o.Set_Name("westfly");
o.Speak(o.Get_Name());
stroll,看了你的囘答,非常滿意。

你又把問題勾起來了,那麽這裏Base.call(this, v_sName)用成Base.apply(this),我怎麽將v_sName傳遞到Base.BaseName,我反倒對apply的使用有點不好理解了。

最終使用Base.apply(this, [v_sName])用數組傳遞成功

那麽這樣看call和apply僅僅是參數不同了?
<script language=jscript>
//westfly原创
//不要问我有什么用,当你某一天需要用到时能想起来就可以了
function JSObject()
{
this._Name = "JSObject";
this.Set_Name = function(Value){
this._Name = Value;
}
this.Get_Name = function(){
return this._Name;
}
this.Speak = function(){alert("wangwang")}
}
function JSHuman() // extends JSObject
{
this.prototype = new JSObject(); // 注意:这可不是小写的prototype
this.prototype.Speak = function(s){
alert(s);
}
return this.prototype;
}
var o = new JSHuman();
o.Set_Name("westfly");
o.Speak(o.Get_Name());
</script>
擴展了一下,這樣子是不是有簡單的OOP重載功能?
<SCRIPT LANGUAGE="JavaScript">
<!--
function Base( v_sBaseName )
{
        this.BaseName = v_sBaseName
        this.BaseMethod = BaseMethod;
        function BaseMethod( v_sStr )
        {
                alert("BaseName: " + this.BaseName + "\n" + "ExtendStr: " + v_sStr);
        }
}

function Son( v_sName )
{
        Base.call(this, v_sName)
        this.base = new Base(v_sName)   //建立一個基對象實例以便重載後可以調用基對象的函數
        this.Name = v_sName
        this.Method = Method;
        function Method( v_sStr )
        {
                alert("Name: " + this.Name + "\n" + "ExtendStr: " + v_sStr);
        }
        this.BaseMethod = BaseMethod;
        function BaseMethod( v_sStr )
        {
                alert("Override BaseName: " + this.BaseName + "\n" + "Override ExtendStr: " + v_sStr);
        }
}

var O = new Son("初始化字串")

O.Method("Method附加字串");
O.BaseMethod("重載後的BaseMethod附加字串");
O.base.BaseMethod("BaseMethod附加字串");
//-->
</SCRIPT>
To bencalie ,是的,的确仅仅如此

不过不要认为apply这样是麻烦,其实如果两个对象的构造参数顺序一样的话,可以这么来
Base.apply(this, arguments) 很方便吧?

附上:(因为30秒才一贴~~)
不过你那里添加一个 new Base() 是认为无法继承的做法,其实是可以继承方法的,O.BaseMethod() 的调用就是了 ^_^
Roman,昨天我也攷慮過你這種方法,可是基對象的實例已經可以直接調用Speak方法了
to:bencalie

基对象的方法被overwrite了.为什么stroll说  var o = new JSHuman(); o 这个实例是无法访问 JSHuman 的成员的
請看如下代碼:

<script>
//westfly原创
//不要问我有什么用,当你某一天需要用到时能想起来就可以了

function JSObject()
{
this._Name = "JSObject";

this.Set_Name = function(Value){
this._Name = Value;
}

this.Get_Name = function(){
return this._Name;
}
}

function JSHuman() // extends JSObject
{
this.JSHumanName="This is JSHumanName"  // 定義JSHuman的成員SHumanName
this.Prototype = new JSObject();
this.Prototype.Speak = function(s){
alert(s);
}
return this.Prototype;
}

var o = new JSHuman();
o.Set_Name("westfly");
o.Speak(o.Get_Name());
o.Speak(o.JSHumanName);   // 訪問JSHuman的成員SHumanName,但是不成功
</script>
stroll,方法的確繼承過來了,但我在Son對象的搆造函數裏重寫了BaseMethod()

事實上O.BaseMethod()這樣調用已經不是Base對象的BaseMethod()方法了,而是Son對象的BaseMethod()方法,所以我把Base的一個實例儅作Son的成員base,使用
         
      Son實例.base.BaseMethod()
         
的格式來引用Base的BaseMethod()方法


另外,我喜懽這句:Base.apply(this, arguments)
虽然说JS是没有指针了…… 不知道同时构造一个“父对象”,一个“子对象” 再有一个函数传递一个对象参数,这个参数使用父子共有的方法,是不是能够分别调用相应的方法呢? 还未了解JS 的 this 是不是相当于 虚拟地址的指针呢?
所以替换了方法才能解决上面的疑惑(虽然这个迷惑是菜了点,不过符合逻辑:)

还有……如果里面成员有构造对象的函式,是不是也会像c++一样先构造对象,然后再执行其他函式呢? 这个可能或则肯定是按照从上到下了~~~~语言规定?没试过

有没有试过多个父对象的继承呢?不过也不难想到这个一步……(树状继承)

这些就是偶的疑问啦,呵呵……

25楼  

prototype是对对象原形操作的~~
可以添加~任何属性和方法,也可以删除,所有从原形实例话的对象都有这些属性和方法
给个例子就知道了
<script>
String.prototype.defaultText="这是String对象的默认值,也是一个静态属性";

var sss=new String();

alert(sss.defaultText);//任何字符传都有这个属性了


alert("所有的字符串都会有defaultText这个默认值属性:"+"所有的字符串都会有defaultText这个默认值属性".defaultText)

function b()
{
alert(String.prototype.defaultText);
b1.style.display="block";
}

function a()
{
delete String.prototype.defaultText;

}

 

</script>
<button onclick="b()">显示String对象的defaultText属性</button>
<button id=b1 style="display:none" onclick="a()">删掉String对象的defaultText属性</button>

posted on 2006-03-18 13:35 汪杰 阅读(166) 评论(0)  编辑 收藏 引用 所属分类: javascript
只有注册用户登录后才能发表评论。

<2024年3月>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(15)

随笔分类(1)

随笔档案(90)

文章分类(727)

文章档案(712)

相册

收藏夹

http://blog.csdn.net/prodigynonsense

友情链接

最新随笔

搜索

  •  

积分与排名

  • 积分 - 456687
  • 排名 - 6

最新随笔

最新评论

阅读排行榜

评论排行榜