【筆記】javascript原型屬性prototype,javascript原型鏈
在javascript中,函數本身也是一個包含了方法和屬性的對象。
length返回的是參數的數量。
在第4章中,我們已經學習了如何定義構造器函數,並用它來建立(構造)對象。這種做法的主要意圖是通過new操作符來調用函數,以達到訪問對象this值的目的,然後,構造器就可以將其所建立的對象返回給我們。這樣,我們就有了一種賦予建立對象一定功能(即為其添加屬性和方法)的方法。
利用原型添加方法和屬性:function Gadget(name,color){ this.name = name; this.color = color; this.wharAreYou = function(){ return 'I am a ' + this.color + ' ' + this.name; }}
/* 通過prototype添加屬性和方法 */Gadget.prototype.price = 100;Gadget.prototype.rating = 3;Gadget.prototype.getInfo = function() { return 'Rating: ' + this.rating +',price: ' + this.price;};
/* 除了以上的方式,還可以通過定義一個對象,然後將其覆蓋到之前的原型上 */Gadget.prototype = { price2:100, rating2:3, getInfo:function(){ return 'Rating2 :' + this.rating2 + ',price2: ' + this.price2; }};
/* 使用原型的方法和屬性 */var newtoy = new Gadget('webcam','black');
從啟動並執行結果來看,後面的方式和前面方式並存的時候,會完全覆蓋掉之前的原型。對於原型來說,最終的是我們要理解它的“駐留”(live)概念。由於在javascript中,對象都是通過傳引用的方式來傳遞的,因為我們建立的每個新對象實體中並沒有一份屬於自己的原型副本。我們可以隨時修改原型,並且與之相關的對象也都會繼承這一改變。甚至可能會影響在修改之前就已經建立了對象。
但是如果對象是在逐個添加之前,則不會發生全部覆蓋的情況。而是部分覆蓋 :
可枚舉屬性:newtoy.hasOwnProperty('price')falsenewtoy.hasOwnProperty('name')truenewtoy.constructor.prototype.propertyIsEnumerable('price');false //書上是true
為什麼和書上的有出入呢?
每個對象都有一個isPrototypeOf()方法,這個方法會告訴我們當前對象是否是另一個對象的原型。
var monkey = { hair:true, feeds:'bananas', breathes:'air'};
function Human(name){ this.name = name;}
Human.prototype = monkey;
var george = new Human('George');monkey.isPrototypeOf(george);
-> true
神秘的__proto____proto__實際上是某個實體物件的屬性,而prototype則是屬於構造器函數的屬性。千萬要記住,__proto__只能在學習或調試的環境下使用。