Object Oriented(二)原型物件

2022-01-11 04:50:05 字數 3958 閱讀 9547

自用備忘筆記

1. 理解原型物件

只要建立函式,函式上就會建立乙個 prototype 屬性指向函式的原型物件。

function

person() {}

person.prototype

//指向該函式的原型物件

所有原型物件會自動獲得乙個 constructor 屬性指向 prototype 屬性所在的函式。

person.prototype.constructor === person;  //

true

每個通過建構函式生成的例項物件,都包含乙個 [[prototype]] 屬性指向其建構函式的原型物件,在 firefox、safari 和 chrome 中可以通過 __proto__ 來訪問。

var daryl = new

person();

daryl.__proto__ === person.prototype; //

true

雖然無法通過標準的方法訪問 [[prototype]] 方法,但可以通過 isprototypeof() 方法來確實關係。

person.prototype.isprototypeof(daryl);  //

true

es5新增了乙個方法:object.getprototypeof(),該方法可以返回 [[prototype]] 的值。

object.getprototypeof(daryl) === person.prototype;  //

true

雖然通過例項物件可以訪問原型中的屬性,但無法通過例項物件重寫原型中的屬性。

function

person() {}

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 方法一起使用。

function

person() {}

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. 更簡單的原型語法

為了避免重複書寫,可以通過物件字面量的方式重寫原型物件。 

function

person() {}

person.prototype =

};

這種方式會導致原型物件上的 constructor 屬性丟失,可以手動指定 constructor 屬性。

function

person() {}

person.prototype =

};

但 constructor 本身是不可列舉的,可以通過 es5 新增的 object.defineproperty() 方法設定。

object.defineproperty(person.prototype, 'constructor', );

4. 原型的動態性

由於在原型中查詢值的過程是一次搜尋,因此在任何時候對原型物件的修改都會立即反映在例項上。

var daryl = newperson();

person.prototype.sayhi = function

() ;

daryl.sayhi();

//hi

但是重寫原型物件會導致建構函式與原型之間的聯絡被切斷。

var daryl = new

person();

person.prototype =

};daryl.sayhi();

//出錯

5. 原生物件的原型

原型模式不僅應用在自定義型別方面,就連所有原生的引用型別,都是採用這種模式建立的。它們都在其建構函式的原型上定義了方法。

array.prototype.sort;  //

function

string.prototype.substring; //

function

還可以在原生物件上定義新方法,如下,定義乙個反轉字串的方法。

string.prototype.reversestring = function

() ;

'hello world!'.reversestring(); //

!dlrow olleh

6. 原型的問題

由於原型上所有屬性均是共享的,若某個例項對原型中的引用型別屬性進行修改,則這乙個修改會反映在所有例項上。

function

person() {}

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處。二叉堆有兩種 最大堆和最小堆。最大堆中,除根結點外 其無父結點 每個結點的關鍵字都...