讀 arale 原始碼之 class 篇

2021-09-19 16:52:41 字數 3973 閱讀 6227

更新:讀 arale 原始碼之 attribute 篇

arale 是阿里、開源社群明星人物--玉伯,開發的一套元件,**相當優美,大讚玉伯的開源精神,我是您的粉絲。

這裡分享下我對這段源**的感悟,若有錯誤的地方,煩請指正。= ̄ω ̄=

先看看 segementfault 上討論的一道題。

function f() {}

object.prototype.a = function() {}

function.prototype.b = function() {}

var f = new f()

// f.a f.b f.a

f 可以呼叫 a 和 b,因為 f 的原型鏈是這樣的。(直觀解釋:f 是 function 例項,f 繼承自 object)

f ----> function.prototype ----> object.prototype ----> null

//既 f.__proto__ === function.prototype

// function.prototype.__proto__ === object.prototype

// object.prototype.__proto__ === null

而 f 只能呼叫 a , f 的原型鏈是這樣的。(直觀解釋:f 是 f 的例項,一切皆物件,f 繼承自 object)

f ----> f.prototype ----> object.prototype ----> null

//既 f.__proto__ === f.prototype

// f.prototype.__proto__ === object.prototype

// object.prototype.__proto__ === null

在 f 的原型鏈上並沒有 function.prototype . 因此訪問不到 b 。

注意,訪問原型物件__proto__是非標準方法,es5 標準方法是 object.getprototypeof();

到這裡,基於原型鏈的繼承已經很明顯了,只需要

function animal() {}

function dog() {}

dog.prototype.__proto__ = animal.prototype;

var dog = new dog();

// dog.__proto__ --> dog.prototype;

// dog.__proto__.__proto__ --> animal.prototype

基於 es5 標準寫法是

dog.prototype = object.create(animal.prototype);
// 建立原型鏈

function ctor() {};

var createproto = object.__proto__ ? function(proto)

} : function(proto)

有三種寫法可以實現原型鏈繼承,但是我測試 new ctor 是最慢的啊,object.creaete 其次,__proto__是最快的。

function ctor() {}

function getproto1(proto, c)

function getproto2(proto, c)

})}function getproto3(proto, c)

}

接著往下看。。。

function class(o) 

}function classify(cls)

這種寫法是,當不使用new關鍵字呼叫時,將引數類化,如:

修改:是不支援new的方式呼叫。

function animal() {}

animal.prototype.talk = function() {}

//class(animal); animal 擁有了 extend 和 implement 方法

var dog = class(animal).extend(

})

class 的三個變種屬性extendsimplementsstatics

這三個屬性會做特殊處理

class.mutators = ,

// 混入屬性,可以混入多個類的屬性

implements: function(items)

},statics: function(staticproperties)

}

再來看看implement方法, 它是用來混入屬性的。

三個變種屬性將被執行

function implement(properties)  else 

}}

好了,最關鍵的方法class.create來了,它是用來建立類的,可以指定父類。

class.create = function(parent, properties) 

properties || (properties = {});

// 如果指定了 extends 屬性, 父類就是它了

parent || (parent = properties.extends || class);

properties.extends = parent;

// 建立子類的建構函式

function subclass()

} // 指定父類的情況下,繼承父類的屬性

if (parent !== class)

// 為子類新增例項屬性,三個特殊屬性,在這裡被執行

implement.call(subclass, properties);

// 返回可繼續 繼承 的子類

return classify(subclass);

}

最後來看看繼承的方法class.extend,被 classify 的類,都可以繼續建立子類。

class.extend = function(properties) );

// 指定父類為呼叫者

properties.extends = this;

return class.create(properties);

}

最後的最後,簡單介紹它的工具類,helpers

// 屬性混合,增加白名單限制

function mix(r, s, wl) }}}

// .indexof 是 es5 加入的,並非所有瀏覽器都支援。

// 這裡沒有也不需要使用 polyfill 的方式。

var indexof = array.prototype.indexof ? function(arr, item) : function(arr, item)

} return -1;

}// 這個很簡單,只有 object.prototype.tostring 才能知道它的 [[class]]

var tostring = object.prototype.tostring;

var isarray = array.isarray || function(val)

var isfunction = function(val)

讀原始碼之 ArrayBlockingQueue

arrayblockingqueue是concurrent包提供的乙個執行緒安全的佇列,由乙個陣列來儲存佇列元素.通過 b takeindex b 和 b putindex b 來分別記錄出佇列和入佇列的下標,以保證在出佇列時 b 不進行元素移動 b 在出佇列或者入佇列的時候對takeindex或者...

讀JDK原始碼 之NUMBER

number是乙個抽象類,他是bigdecimal,biginteger,byte,double,float,integer,long,short的父類 他提供以下抽象方法 1 public abstract int intvalue 該方法把此物件所代表的值轉換為int 2 public abst...

讀HashSet原始碼

先看建構函式 public hashset public hashset int initialcapacity public hashset int initialcapacity,float loadfactor 這個構造方法不是public的,僅用於linkedhashset.hashset ...