js 原型(prototype 繼承相關2

2021-07-04 15:45:59 字數 1976 閱讀 5989

function

supertype

(name)

//在supertype的原型中定義方法

supertype.prototype.sayname = function

()function

subtype

(name,age)

subtype.prototype = new supertype();

***subtype.prototype.constructor = subtype;***

subtype.prototype.sayage = function

()var instance1 = new subtype("xiaolu",23);

instance1.colors.push("black");

alert(instance1.colors); //red,blue,green,black

instance1.sayname();//xiaolu

instance1.sayage();//23

var instance2 = new subtype("xiaowang",23);

alert(instance2.colors);//red,blue,green

instance2.sayname();//xiaowang

instance2.sayage();//23

嗯,如你所見【結果是我們想要的】,而為什麼要提出這種組合繼承呢?最大的好處是首先避免了直接原型鏈實現繼承那種將物件中例項屬性變成了原型中的屬性【也就成為了共享的了】從而導致乙個物件對屬性的修改,影響到其他物件中的屬性【可以見上篇】,同時,沒有在建構函式中對方法進行定義,避免了每個物件都對方法進行一次定義【浪費空間,也不優雅】。但是,等等,有疑問了:

subtype.prototype = new supertype();
**中還是有這一句啊,這樣不是把supertype中的實體屬性變成了subtype的原型了嗎?原型中的屬性是共享的吖?為什麼instance1的push操作,沒有影響到instance2的colors屬性呢?

發現這個問題,嗯,首先你是個愛思考的人- -

其實吧,你,說的也對。原型中的屬性是共享的,這一句**的存在也確實如你所說,把實體屬性變成了原型中的屬性。這個沒有錯。但是注意這一句:

function subtype(name,age)
發現沒有?在subtype中首先呼叫了supertype建構函式,再想想上篇文章,應該理解了,嗯,這裡呢,給new出來的subtype物件中,又重新塞入了name和colors屬性【存在於supertype中的屬性】。這樣子的話,subtype的prototype物件中確實也是有name和colors了,但是,subtype實體中也是有這些屬性的,而我們知道,對於屬性(或者方法)的獲取,是先從實體中找,找不到的情況下,去原型中找,然後再往上。那麼實體中有了,自然就不需要去原型中找了。【有點繞,不太理解的話,可以細細思考下】,當然了,也可以說這是這個模式的乙個缺點。那麼可不可以不要:

subtype.prototype = new supertype();
這句話,因為它的存在,導致了原型中還有乙份supertype的屬性。哦,你想的很對,但是,不要還真不行!

因為什麼呢?你自己先想想- -

你需要supertype的例項【本例子中沒有】或者supertype原型中定義的函式方法【比如 sayname】,如果去掉了這一句,繼承鏈斷了,那麼

instance1.sayname();//xiaolu
就會出錯【sayname是什麼???】

**

*subtype.prototype.constructor = subtype;***

個人覺得,在本例中,這一句話可以不要的。當然了,存在的意義也許是你可以使用instanceof操作符判斷物件型別了吧【- -】

JS 原型(prototype)詳解

首先來看一段 function c function f 在js中 function 關鍵字有兩個含義,既可以把它當作乙個普通函式關鍵字,也可以把它當作類的建構函式 即定義類 關鍵字。上面定義的兩個函式,不管你是想定義乙個類的建構函式還是就定義乙個普通函式。它們都包含乙個prototype和cons...

js中的原型prototype

var arr1 new array 12,34,98,43,38,79,56,1 arr1.sum function var result 0 for var i 0 i如果現在還有個arr1 物件也要求和 var arr2 new array 54,29,1,10 那麼還要給 arr2再新增乙個...

物件導向 prototype 原型鏈 繼承

物件導向 oop,即 object oriented 是相對於面向過程來講的,簡單說就是把資料和方法組合封裝起來成為乙個整體,提高軟體的重用性 靈活性和擴充套件性。物件導向特點 當建立的物件較多時,會有可共用的屬性,此時就可用prototype。比如我們用array來建立乙個例項時,不用我們定義,它...