自用備忘筆記
1. 理解原型物件
只要建立函式,函式上就會建立乙個 prototype 屬性指向函式的原型物件。
functionperson() {}
person.prototype
//指向該函式的原型物件
所有原型物件會自動獲得乙個 constructor 屬性指向 prototype 屬性所在的函式。
person.prototype.constructor === person; //true
每個通過建構函式生成的例項物件,都包含乙個 [[prototype]] 屬性指向其建構函式的原型物件,在 firefox、safari 和 chrome 中可以通過 __proto__ 來訪問。
var daryl = newperson();
daryl.__proto__ === person.prototype; //
true
雖然無法通過標準的方法訪問 [[prototype]] 方法,但可以通過 isprototypeof() 方法來確實關係。
person.prototype.isprototypeof(daryl); //true
es5新增了乙個方法:object.getprototypeof(),該方法可以返回 [[prototype]] 的值。
object.getprototypeof(daryl) === person.prototype; //true
雖然通過例項物件可以訪問原型中的屬性,但無法通過例項物件重寫原型中的屬性。
functionperson() {}
person.prototype.name = 'daryl';
var person1 = new
person(),
person2 = new
person();
person1.name = 'nicholas';
person1.name;
//nicholas
person2.name; //
daryl
對物件屬性的訪問,是先檢索例項上有無該屬性,再檢索原型物件上有無該屬性。若刪除例項上的屬性,則會恢復對原型物件屬性的訪問。
person1.name = 'nicholas';delete
person1.name;
person1.name;
//daryl
通過 hasownproperty 方法可以檢測某個屬性究竟來自例項還是原型。
person1.name = 'nicholas';person1.hasownproperty('name'); //
true
person2.hasownproperty('name'); //
false
2. 原型與 in 操作符
in 操作符用來檢測某個物件中是否有某個屬性,可以單獨使用,也可以搭配 for 使用。
person1.name = 'nicholas';'name' in person1; //
true
'name' in person2; //
true
使用 for-in 遍歷物件的屬性時會將原型上的屬性一起遍歷,如果需要濾掉這部分,可以搭配 hasownproperty 方法一起使用。
functionperson() {}
person.prototype.name = 'nicholas';
var person = new
person();
person.age = 29;
person.gender = 'male';
for (var o in
person)
}
es5新增了 object.keys 方法,用來返回乙個所有可列舉的例項屬性的集合。
object.keys(person); //['age', 'gender']
如果想要得到所有的屬性,無論是否可列舉,可以使用 object.getownpropertynames。
object.getownpropertynames(person.prototype); //['constructor', 'name']
以上兩種方法都可以用來代替 for-in 迴圈。
3. 更簡單的原型語法
為了避免重複書寫,可以通過物件字面量的方式重寫原型物件。
functionperson() {}
person.prototype =
};
這種方式會導致原型物件上的 constructor 屬性丟失,可以手動指定 constructor 屬性。
functionperson() {}
person.prototype =
};
但 constructor 本身是不可列舉的,可以通過 es5 新增的 object.defineproperty() 方法設定。
object.defineproperty(person.prototype, 'constructor', );
4. 原型的動態性
由於在原型中查詢值的過程是一次搜尋,因此在任何時候對原型物件的修改都會立即反映在例項上。
var daryl = newperson();person.prototype.sayhi = function
() ;
daryl.sayhi();
//hi
但是重寫原型物件會導致建構函式與原型之間的聯絡被切斷。
var daryl = newperson();
person.prototype =
};daryl.sayhi();
//出錯
5. 原生物件的原型
原型模式不僅應用在自定義型別方面,就連所有原生的引用型別,都是採用這種模式建立的。它們都在其建構函式的原型上定義了方法。
array.prototype.sort; //function
string.prototype.substring; //
function
還可以在原生物件上定義新方法,如下,定義乙個反轉字串的方法。
string.prototype.reversestring = function() ;
'hello world!'.reversestring(); //
!dlrow olleh
6. 原型的問題
由於原型上所有屬性均是共享的,若某個例項對原型中的引用型別屬性進行修改,則這乙個修改會反映在所有例項上。
functionperson() {}
person.prototype.friends = ['shelby', 'court'];
var person1 = new
person(),
person2 = new
person();
person1.friends.push('van');
person2.friends;
//['shelby', 'court', 'van'];
Python opencv 二 畫素運算 二
使用工具python3.x 使用庫numpy opencv,1.cv.bitwise and s1,s2 s1,s2為cv.imread函式返回的物件,表示將s1和s2的畫素進行邏輯與運算,函式會返回乙個物件。可以通過cv.imshow顯示出進行直觀感受。2.cv.bitwise or s1,s2 ...
大二第二學期周學習進度總結(二)
本週檢測的是從文件中讀取隨機數並得到最大連續子陣列,難度並不是很大,主要是需要使用biginteger來進行運算解決問題,我經常有這樣的感覺,就是很多情況下已經有了很成熟的技術,但是我們這些初學者僅僅是因為不知道,所以導致我們不知道這些方法如何解決,這個問題在課堂上困住了不少人,也許不少人是因為懶得...
二叉堆實現二
堆可以視為一棵完全二叉樹,樹的每一層都是被填滿的,最後一層可能除外,所以堆可以用陣列來表示。對於陣列中任意位置 i上的元素,其左兒子在位置 i 2 1 其右兒子在位置 i 2 2 上,其父節點在位置 i 1 2 1處。二叉堆有兩種 最大堆和最小堆。最大堆中,除根結點外 其無父結點 每個結點的關鍵字都...