var Class = (function() { //臨時(shí)存儲(chǔ)parent的prototype function subclass() {};

//創(chuàng)建類的方法 function create() { var pare " /> 人淫阁,9420高清完整版在线电影免费观看 ,欧美18videosex

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

Prototype Class對(duì)象學(xué)習(xí)

復(fù)制代碼 代碼如下:
/* Based on Alex Arnell's inheritance implementation. */

var Class = (function() {
//臨時(shí)存儲(chǔ)parent的prototype
function subclass() {};

//創(chuàng)建類的方法
function create() {
var parent = null, properties = $A(arguments);
    //檢查新建一個(gè)類時(shí),是否指定了一個(gè)父對(duì)象
    //如果指定了父類,賦值給parent
if (Object.isFunction(properties[0]))
parent = properties.shift();

//真正用作返回的類,在創(chuàng)建實(shí)例時(shí),將調(diào)用initialize方法進(jìn)行初始化
function klass() {
this.initialize.apply(this, arguments);
}

//給klass添加addMethods方法,在調(diào)用create方法之后
    //仍可以調(diào)用addMethods方法進(jìn)行類級(jí)別的方法擴(kuò)充
Object.extend(klass, Class.Methods);
    //給返回的類添加兩個(gè)屬性,superclass:父類,subclasses:子類的集合
klass.superclass = parent;
klass.subclasses = [];

//如果創(chuàng)建類時(shí)指定了父對(duì)象,則把klass的原型指向父對(duì)象的實(shí)例,實(shí)現(xiàn)原型鏈繼承
if (parent) {
subclass.prototype = parent.prototype;
klass.prototype = new subclass;
     //為父類添加子類,維護(hù)父類的子類集合
parent.subclasses.push(klass);
}

//向新類添加方法
for (var i = 0; i < properties.length; i++)
klass.addMethods(properties[i]);

//如果沒有指定初始化方法,則默認(rèn)把一個(gè)空方法賦給初始化方法
if (!klass.prototype.initialize)
klass.prototype.initialize = Prototype.emptyFunction;

    /*
     * 修正新類的構(gòu)造函數(shù),使得構(gòu)造函數(shù)指向自己,這里特意說一下(如果注釋掉下面這行):
     * var Person=Class.create();
     * var p1=new Person();
     * alert(p1.constructor==Person) //true
     * var Man=Class.create(Person)
     * var m1=new Man();
     * alert(m1.constrcutor==Man) //false
     * alert(m1.constrcutor==Person) //true
     * alert(m1.construcctor==p1.constrcutor) //true
     *
     * 看出問題來了吧?Man的構(gòu)造函數(shù)竟然指向了Person的構(gòu)造函數(shù)
     * 問題的根源在klass.prototype = new subclass;這句話
     * 具體原因我就不解釋了,要詳細(xì)理解的請(qǐng)查看《JavaScript語(yǔ)言精髓與編程實(shí)踐》155~160頁(yè)
    */
klass.prototype.constructor = klass;
return klass;
}

//把創(chuàng)建類時(shí)的方法添加到新類,或者在創(chuàng)建完類之后在添加類級(jí)別的方法
function addMethods(source) {
    //取得新類的父類
var ancestor = this.superclass && this.superclass.prototype;
var properties = Object.keys(source);

    //貌似下面的判斷總是為真,不知道為什么這么寫,知道的告訴我?
if (!Object.keys({ toString: true }).length) {
//如果新類重寫了toString和valueOf方法則添加之
if (source.toString != Object.prototype.toString)
properties.push("toString");
if (source.valueOf != Object.prototype.valueOf)
properties.push("valueOf");
}

//遍歷所有的新類聲明中的方法
for (var i = 0, length = properties.length; i < length; i++) {
     //property是函數(shù)名稱,value是函數(shù)體
var property = properties[i], value = source[property];
     //判斷這個(gè)方法是否需要調(diào)用父類的同名方法
if (ancestor && Object.isFunction(value) &&
value.argumentNames().first() == "$super") {
var method = value;
        //這里很重要!
        //替換$super參數(shù),使得這個(gè)參數(shù)指向父類的同名方法
        //這里應(yīng)用了Function的wrap方法,wrap方法的解釋請(qǐng)參考【Prototype 學(xué)習(xí)――Function對(duì)象】
        //method是新定義的方法,所以他的第一個(gè)參數(shù)為$super,然后從'='到'.'之間返回的是父類的同名方法
        //最后調(diào)用wrap方法把$super參數(shù)替換成父類的同名方法,這樣在子類調(diào)用$super()時(shí),將調(diào)用父類的同名方法
        //這里構(gòu)造的非常棒!值得思考
value = (function(m) {
return function() { return ancestor[m].apply(this, arguments); };
})(property).wrap(method);

        //將新產(chǎn)生的value(即經(jīng)過修改過的子類方法)的valueOf和toString指向原子類的同名方法
        //這里是在修正調(diào)用wrap方法之后的遺留問題
value.valueOf = method.valueOf.bind(method);
value.toString = method.toString.bind(method);
}
     //把方法添加到新類中
this.prototype[property] = value;
}

return this;
}

//返回Class的可調(diào)用方法
return {
create: create,
Methods: {
addMethods: addMethods
}
};
})();

這個(gè)類就提供了2個(gè)方法:create和addMethods,上面的源碼注釋中已經(jīng)說明的很清楚了,下面就看些例子,具體說明一下用法:
復(fù)制代碼 代碼如下:
//聲明Person類,并定義初始化方法
var Person = Class.create({
initialize: function(name) {
this.name = name;
},
say: function(message) {
return this.name + ': ' + message;
}
});

// when subclassing, specify the class you want to inherit from
var Pirate = Class.create(Person, {
// redefine the speak method
//注意這里的$super用法,在對(duì)照源碼中的解釋仔細(xì)看一下
say: function($super, message) {
return $super(message) + ', yarr!';
}
});

var john = new Pirate('Long John');
john.say('ahoy matey');
// -> "Long John: ahoy matey, yarr!"


復(fù)制代碼 代碼如下:
var john = new Pirate('Long John');
john.sleep();
// -> ERROR: sleep is not a method
// every person should be able to sleep, not just pirates!

//這里是addMethods的用法,可以在類級(jí)別擴(kuò)充方法
Person.addMethods({
sleep: function() {
return this.say('ZzZ');
}
});
john.sleep();


復(fù)制代碼 代碼如下:
//這里是superclass和subclasses兩個(gè)屬性的用法

Person.superclass
// -> null
Person.subclasses.length
// -> 1
Person.subclasses.first() == Pirate
// -> true
Pirate.superclass == Person
// -> true

三個(gè)例子幾本覆蓋了Class類的方法,詳細(xì)例子請(qǐng)參考:http://prototypejs.org/learn/class-inheritance

JavaScript技術(shù)Prototype Class對(duì)象學(xué)習(xí),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产成人精品免费视频下载 | 国产99视频精品免费播放 | 国产精品自在拍在线播放 | 中文字幕精品在线观看 | av天堂网站avtt2017 | 男子扒开美女尿口做羞羞的事 | 轻点慢点1V2啊高H抽插 | 全黄h全肉短篇禁乱np | 在线高清无码欧美久章草 | 成人国内精品久久久久影 | 动漫美女性侵 | 国产欧美日韩综合精品一区二区 | 试看2分钟AA片 | 小蝌蚪视频在线观看免费观看WWW | 99C视频色欲在线 | 伊人在线高清视频 | 98久久人妻少妇激情啪啪 | 好大好爽好深舒服死了 | 动漫美女禁区 | 久久re6热在线视频精品66 | 成年免费三级视频 | 亚洲国产夜色在线观看 | 成人在线观看免费视频 | 日韩精品 电影一区 亚洲高清 | 久久精品亚洲国产AV涩情 | 中文无码不卡的岛国片国产片 | 桃色窝| 365电影成人亚洲网在线观看 | 欧美一区二区三区不卡免费 | 成人bt下载 | 飘雪在线观看免费高清完整版韩国 | 国产成人免费a在线资源 | 久章草一区二区 | 国产精品99久久久久久AV蜜臀 | 日本久久精品免视看国产成人 | 性生大片免费看 | 男女啪啪抽搐呻吟高潮动态图 | 亚洲涩福利高清在线 | 久久夜色精品国产亚州AV卜 | 精品久久综合1区2区3区激情 | 哇嘎在线精品视频在线观看 |