《javascript語言精粹》學習筆記3

第五章 繼承
在基於類的語言中,對象是類的實例,而且類能夠從另外一個類繼承。js特別在於它是基於原型的語言,它的對象能夠直接從其餘對象繼承。
1.僞類

僞類的意思是,js有new的相似於類的寫法。只是這種寫法,看起來格格不入,實際上隱藏那些無謂的prototype操做細節,它仍是沒有私有環境,也沒法訪問super類。 2.對象說明符

傳遞的參數以列表的形式,倒不如以對象的形式。函數

<!-- lang: js -->
var myObject = maker(f, l ,m, c, s);

var myObject = maker({
first: f,
middle: m,
last: l,
state: s,
city: c
});

3.原型

基於原型的繼承:一個新對象能夠繼承一個就對象的屬性。經過構造一個有用的對象開始,接着能夠構造更多和那個對象相似的對象。 先構造一個有用的對象。this

<!-- lang: js -->
var myMammal = {
name : 'Herb the Mammal',
get_name : function () {
	return this.name;
},
says : function () {
	return this.saying || '';
}
};

接下來,利用第三章的Object.create方法構造更多的實例(見我前面的文章第6點)。spa

<!-- lang: js -->
var myCat = Object.create(myMammal);
myCat.name = 'Henrietta';
myCat.saying = 'meow';
myCat.purr = function (n) {
	var i, s = '';
	for (i = 0; i < n; i += 1) {
		if (s) {
			s += '-';
		}
		s += 'r';
	}
	return s;
};
myCat.get_name = function () {
	return this.says + ' ' + this.name + ' ' + this.says;
};

4.函數化

以前的繼承模式的弱點就是無法保護隱私。 這裏來一個函數化構造器的僞代碼模板。.net

<!-- lang: js -->
var constructor = function (spec, my) {
var that,其餘的私有實例變量;
my = my || {};

把共享的變量和函數添加到my中

that = 一個新對象

添加給 that 的特權方法

return that;
};

讓咱們把這個模式應用到mammal的例子裏。此處不須要my。 name和saying屬性如今是徹底私有的。只有經過get_name和says兩個特權方法才能夠訪問他們。prototype

<!-- lang: js -->
var mammal = function (spac) {
var that = {};

that.get_name = function () {
	return spac.name;
};
that.says = function () {
	return spec.saying || '';
};

return that;
};

var myMammal = mammal({name : 'Herb'});

在僞類模式裏,構造器函數Cat不得不重複構造器Mammal已完成的工做(這句話理解不能 TT)。在函數化模式中那再也不須要了,由於構造器Cat會調用構造器Mammal,讓Mammal去作對象建立中的大部分工做,因此Cat只需關注自身的差別便可。code

5.部件(hard)

相關文章
相關標籤/搜索