1. 原型物件:通過呼叫建構函式而建立的物件的例項都有乙個原型物件,該原型物件包含同乙個建構函式建立的物件所共享的屬性和方法。
2. prototype屬性:建立的每個函式都有乙個prototype屬性,該屬性是乙個指標,指向原型物件。
3. 使用原型物件的好處是:讓所有的物件例項共享他所包含的屬性和方法。
如: function person()
console.log(object.getprototypeof(p1).name); //rourou
5. 不能通過物件例項重寫原型物件中的值,但可以通過物件例項訪問原型物件中的值。(在讀取某個物件中的屬性時,首先會先搜尋物件例項本身,如果沒有再搜尋原型物件)。通過delete刪除屬性或方法(原型物件和例項物件都可以刪除)
function person(){
person.prototype.name = "rourou";
person.prototype.age = 22;
person.prototype.sayname = function(){
console.log(this.name);
var p1 = new person();
var p2 = new person();
p1.name = "baobao";
console.log(p1.name); //baobao
console.log(p2.name); //rourou----可以看出,通過物件的例項不能重寫屬性,只能覆蓋屬性(與訪問順序有關)
delete p1.name;
console.log(p1.name); //rourou
delete person.prototype.name;
console.log(p2.name); //undefined
6. hasownproperty():判斷乙個屬性是存在於例項中還是原型中。在例項中返回true
in操作符:在可以訪問給定屬性時,返回true。(無論該屬性是在例項中還是原型中)
如:① hasownproperty()
function person(){
person.prototype.name = "rourou";
person.prototype.age = 22;
person.prototype.sayname = function(){
console.log(this.name);
var p1 = new person();
var p2 = new person();
p1.name = "baobao";
console.log(p1.hasownproperty("name")); //true
console.log(p1.hasownproperty("age")); //false
console.log("age" in p1); //true
圖例:
7. 更簡單的原型語法:
這裡將person.prototype的所有例項屬性封裝在一起。(相當於重寫)但是缺點是原型屬性的constructor指向的是object建構函式。
圖例:
可以將constructor指向person建構函式
8. 原型的動態性:如果不重寫原型物件,那麼先建立物件,再在原型物件中新增屬性,還是先在原型物件中新增屬性,在建立物件,都是可以訪問到相應的屬性和方法的。
但是,如果重寫了原型物件,那麼先建立還是後建立就有區別了。因為先建立物件再重寫時,例項物件指向的是原來的原型物件。(會切斷現有例項與新原型之間的聯絡)
圖例:所以訪問後來新增的屬性,值為undedined
原型模式 建立物件
原型模式 操作 先建立好乙個原型物件,然後通過clone 原型物件來建立新的物件。這就免去了類建立時重複的初始化操作。原型模式適用於大物件的建立。如果每次new 就會消耗很大,原型模式僅需要記憶體拷貝即可。index.php 中 prototype new imooc canvas prototyp...
建立物件及原型模式
工廠模式 function createperson name,age return o createperson 小明 18 建構函式模式 funciton person name age function say var person1 person 小明 18 建構函式的呼叫方式,需要建立 p...
建立物件之原型模式
1,原型模式建立物件 原型也是乙個物件。我們建立的函式都有乙個prototype屬性,這個屬性指向乙個物件,這個物件包含有特定函式建立的例項共享的屬性和方法。使用原型物件可以使所有的例項共享屬性和方法,而不必再建構函式中初始化屬性和方法。function person person.prototyp...