prototype屬性,只有function對(duì)象中才具有的顯式屬性;
網(wǎng)上三種理解:
1:通過(guò)構(gòu)造函數(shù)創(chuàng)建的普通對(duì)象,通過(guò)其constructor屬性引用它的構(gòu)造函數(shù)對(duì)象,從而間接引用(擁有)了構(gòu)造對(duì)象中的prototype對(duì)象;
如圖:
此觀點(diǎn)的文章: 參看 jimichan的文章:詳解javascript類繼承機(jī)制的原理 中的: “(說(shuō)成間接的是因?yàn)槊總€(gè)object都有一個(gè) constructor 屬性指向它的構(gòu)造函數(shù))。”
非常感謝在此問(wèn)題上,作者對(duì)我的回信;如有冒犯,敬請(qǐng)?jiān)彛?/span>
2:構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),copy prototype中的屬性和代碼給所創(chuàng)建的對(duì)象。從而使創(chuàng)建的對(duì)象擁有了prototype中的所有功能和屬性;
如圖:
此觀點(diǎn)的文章: 參看 yiding_he的文章:領(lǐng)悟 JavaScript 中的面向?qū)ο?/a> 中的: “ 在 JavaScript 中,用 new 關(guān)鍵字創(chuàng)建對(duì)象是執(zhí)行了下面三個(gè)步驟的:
1. 創(chuàng)建一個(gè)新的普通對(duì)象;
2. 將方法對(duì)象的 prototype 屬性的所有屬性復(fù)制到新的普通對(duì)象中去。
3. 以新的普通對(duì)象作為上下文來(lái)執(zhí)行方法對(duì)象。”
此觀點(diǎn)在回貼中被 xieye反對(duì)
3:構(gòu)造函數(shù)在創(chuàng)建對(duì)象時(shí),把構(gòu)造函數(shù)中的prototype引用賦給創(chuàng)建的普通對(duì)象;也就是說(shuō)由構(gòu)造函數(shù)創(chuàng)建的對(duì)象,都有一個(gè)指針指向prototype對(duì)象;
如圖:
此觀點(diǎn)的文章: 參看 李站的文章:悟透javascript中的" 我們已經(jīng)知道,用 var anObject = new aFunction() 形式創(chuàng)建對(duì)象的過(guò)程實(shí)際上可以分為三步:第一步是建立一個(gè)新對(duì)象;第二步將該對(duì)象內(nèi)置的原型對(duì)象設(shè)置為構(gòu)造函數(shù)prototype引用的那個(gè)原型對(duì)象;第三步就是將該對(duì)象作為this參數(shù)調(diào)用構(gòu)造函數(shù),完成成員設(shè)置等初始化工作。對(duì)象建立之后,對(duì)象上的任何訪問(wèn)和操作都只與對(duì)象自身及其原型鏈上的那串對(duì)象有關(guān),與構(gòu)造函數(shù)再扯不上關(guān)系了" 以及 “語(yǔ)法甘露 中的:上面代碼的最后一句證明,新創(chuàng)建的對(duì)象的constructor屬性返回的是Object函數(shù)。其實(shí)新建的對(duì)象自己及其原型里沒(méi)有constructor屬性,那返回的只是最頂層原型對(duì)象的構(gòu)造函數(shù),即Object。”
綜上所述:根據(jù)貼子:領(lǐng)悟 JavaScript 中的面向?qū)ο?/a> 中作者 afcn0的回貼 “其實(shí)還有補(bǔ)充,就是如果構(gòu)造函數(shù)返回object類型,那new對(duì)象無(wú)效,prototype問(wèn)題是樓主還不太了解prototype繼承方式,__proto__屬性,以及isPrototypeOf方法所至 ” 的提示,查閱了文章:javascript中的繼承
根據(jù)上文的提示作了簡(jiǎn)單測(cè)試:
總結(jié):
另外:ecma-262中提到:every object created by that constructor has an implicit reference to the prototype (called the object's prototype) associated with its constructor 以及其圖示;不敢肯定它的implicit reference間接還是隱式鏈接;
網(wǎng)上三種理解:
1:通過(guò)構(gòu)造函數(shù)創(chuàng)建的普通對(duì)象,通過(guò)其constructor屬性引用它的構(gòu)造函數(shù)對(duì)象,從而間接引用(擁有)了構(gòu)造對(duì)象中的prototype對(duì)象;
如圖:

此觀點(diǎn)的文章: 參看 jimichan的文章:詳解javascript類繼承機(jī)制的原理 中的: “(說(shuō)成間接的是因?yàn)槊總€(gè)object都有一個(gè) constructor 屬性指向它的構(gòu)造函數(shù))。”
非常感謝在此問(wèn)題上,作者對(duì)我的回信;如有冒犯,敬請(qǐng)?jiān)彛?/span>
2:構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),copy prototype中的屬性和代碼給所創(chuàng)建的對(duì)象。從而使創(chuàng)建的對(duì)象擁有了prototype中的所有功能和屬性;
如圖:

此觀點(diǎn)的文章: 參看 yiding_he的文章:領(lǐng)悟 JavaScript 中的面向?qū)ο?/a> 中的: “ 在 JavaScript 中,用 new 關(guān)鍵字創(chuàng)建對(duì)象是執(zhí)行了下面三個(gè)步驟的:
1. 創(chuàng)建一個(gè)新的普通對(duì)象;
2. 將方法對(duì)象的 prototype 屬性的所有屬性復(fù)制到新的普通對(duì)象中去。
3. 以新的普通對(duì)象作為上下文來(lái)執(zhí)行方法對(duì)象。”
此觀點(diǎn)在回貼中被 xieye反對(duì)
3:構(gòu)造函數(shù)在創(chuàng)建對(duì)象時(shí),把構(gòu)造函數(shù)中的prototype引用賦給創(chuàng)建的普通對(duì)象;也就是說(shuō)由構(gòu)造函數(shù)創(chuàng)建的對(duì)象,都有一個(gè)指針指向prototype對(duì)象;
如圖:

此觀點(diǎn)的文章: 參看 李站的文章:悟透javascript中的" 我們已經(jīng)知道,用 var anObject = new aFunction() 形式創(chuàng)建對(duì)象的過(guò)程實(shí)際上可以分為三步:第一步是建立一個(gè)新對(duì)象;第二步將該對(duì)象內(nèi)置的原型對(duì)象設(shè)置為構(gòu)造函數(shù)prototype引用的那個(gè)原型對(duì)象;第三步就是將該對(duì)象作為this參數(shù)調(diào)用構(gòu)造函數(shù),完成成員設(shè)置等初始化工作。對(duì)象建立之后,對(duì)象上的任何訪問(wèn)和操作都只與對(duì)象自身及其原型鏈上的那串對(duì)象有關(guān),與構(gòu)造函數(shù)再扯不上關(guān)系了" 以及 “語(yǔ)法甘露 中的:上面代碼的最后一句證明,新創(chuàng)建的對(duì)象的constructor屬性返回的是Object函數(shù)。其實(shí)新建的對(duì)象自己及其原型里沒(méi)有constructor屬性,那返回的只是最頂層原型對(duì)象的構(gòu)造函數(shù),即Object。”
綜上所述:根據(jù)貼子:領(lǐng)悟 JavaScript 中的面向?qū)ο?/a> 中作者 afcn0的回貼 “其實(shí)還有補(bǔ)充,就是如果構(gòu)造函數(shù)返回object類型,那new對(duì)象無(wú)效,prototype問(wèn)題是樓主還不太了解prototype繼承方式,__proto__屬性,以及isPrototypeOf方法所至 ” 的提示,查閱了文章:javascript中的繼承
- 此文中提到:jane = new Engineer("Doe, Jane", ["navigator", "javascript"], "belau");
- 調(diào)用這句時(shí),都發(fā)生了什么:
- 1 當(dāng)js看見(jiàn)new操作符,它創(chuàng)建一個(gè)新的普通對(duì)象,并且設(shè)置它的__proto__ 屬性為Engineer.prototype。
- 2 new 操作符傳遞這個(gè)新的對(duì)象作為Engineer 構(gòu)造器的this的值。
- 其實(shí)最主要做的事就是上面的兩件,剩下的都是很簡(jiǎn)單的函數(shù)調(diào)用.
根據(jù)上文的提示作了簡(jiǎn)單測(cè)試:
- function person(name,b){
- this.name=name;
- }
- person.prototype.sayHello=function(a){
- //alert("hello,i am "+this.name);
- alert(this==a);
- }
- function employee(name, salary)
- {
- person.call(this, name); //調(diào)用上層構(gòu)造函數(shù)
- this.salary = salary; //擴(kuò)展的成員
- };
- var p=new person("yangsp",p);
- //p.sayHello(p);
- //alert(p.constructor);
- //下面兩句驗(yàn)證了普通對(duì)象中確有_proto_屬性,且引用的是prototype對(duì)象;(在ff下調(diào)試,ie下不可);
- alert(p.__proto__==person);
- alert(p.__proto__==person.prototype))
- //alert("p有prototype屬性嗎? "+p.prototype); //表明普通對(duì)象中沒(méi)有prototype屬性;
總結(jié):
- 比較贊同第三種理解;
- 即:prototype是function對(duì)象中專有的屬性。
- _proto_是普通對(duì)象的隱式屬性,在new的時(shí)候,會(huì)指向prototype所指的對(duì)象;
- 普通對(duì)象中的constructor屬性指向構(gòu)造函數(shù),因此一個(gè)用構(gòu)造函數(shù)創(chuàng)建的對(duì)象可能有兩種方式關(guān)聯(lián)到prototype.但繼承應(yīng)該是根據(jù)_proto_關(guān)聯(lián)到prototype屬性;
另外:ecma-262中提到:every object created by that constructor has an implicit reference to the prototype (called the object's prototype) associated with its constructor 以及其圖示;不敢肯定它的implicit reference間接還是隱式鏈接;