functionperson()
person.prototype.name = "nicholas";
person.prototype.age = 29;
person.prototype.job = "software engineer";
person.prototype.sayname = function
();
前面例子中每新增乙個屬性和方法就要敲一遍 person.prototype。為減少不必要的輸入,也為了從視覺上更好地封裝原型的功能,更常見的做法是用乙個包含所有屬性和方法的物件字面量來重寫整個原型物件,如下面的例子所示。
functionperson()
person.prototype =
};
我們將 person.prototype 設定為等於乙個以物件字面量形式建立的新物件。最終結果相同,但有乙個例外:constructor 屬性不再指向 person 了。
本質上完全重寫了預設的 prototype 物件,因此 constructor 屬性也就變成了新物件的 constructor 屬性(指向 object 建構函式),不再指向 person 函式。此時,儘管 instanceof操作符還能返回正確的結果,但通過 constructor 已經無法確定物件的型別了,如下所示。
var friend = newperson();
alert(friend
instanceof object); //
true
alert(friend instanceof person); //
true
alert(friend.constructor == person); //
false
alert(friend.constructor == object); //
true
constructor 屬性則等於 object 而不等於 person 了。如果 constructor 的值真的很重要,可以像下面這樣特意將它設定回適當的值:
functionperson()
person.prototype =
};
以上**特意包含了乙個 constructor 屬性,並將它的值設定為 person,從而確保了通過該屬性能夠訪問到適當的值。
注意:以這種方式重設 constructor 屬性會導致它的[[enumerable]]->可列舉特性被設定為 true。預設情況下,原生的 constructor 屬性是不可列舉的,
可以試一試 object.defineproperty():
functionperson()
person.prototype =
};
//重設建構函式,讓其重新指向person;只適用於 ecmascript 5 相容的瀏覽器
object.defineproperty(person.prototype, "constructor", );
這回,cunstructor的指向指回了建構函式,cunstructor屬性也變成了不可列舉的屬性了,為了驗證,如下所示:
var keys =object.keys(person.prototype);alert(keys);
//"name,age,job,sayname"
此時,所有可列舉屬性中不包含cunstructor了。
簡單有趣的原型語法
前些天偶然看到了乙個有趣的原型語法,這種方法稍微簡化了咱們給原型物件新增方法和屬性的書寫過程,而且非常清新,給人一種一目了然的感覺,在這裡欣喜地和大家分享一下 先來看看我們傳統的新增原型物件的屬性 方法的方式 function person person.prototype.name han per...
簡單原型語法和原型動態性
function student student.prototype 簡單原型寫法本質上完全重寫了預設的prototype物件,因此construtor屬性也就變成了新物件的constructor屬性,指向了object建構函式,不再指向student函式。通過constructor已經無法確定物件...
只為更簡單
工作一年多了。一年的奮鬥 一年的迷茫 一年的猶豫 一年的不知所措。曾經志在四方的少年,迷失在茫茫的黑夜之中,看不到一點星光.外包在華為做c 在工具組,位置比較尷尬,測試中的開發,公司也不把你當開發看。平時就孤軍奮戰做些小需求,也沒有切實的大型專案開發經驗,從設計 編碼 測試 交付都乙個人做,除了使用...