function foo的原型與prototype屬性解惑
更新時(shí)間:2010年11月19日 20:04:53 作者:
最近在研究js,疑惑也比較多。主要是被原型這個(gè)東西給弄迷糊了。
疑惑出自于:
function foo {
this.name = 'foo';
}
alert(foo.prototype === Function.prototype ); //false。 當(dāng)時(shí)一直沒想明白為啥foo的原型不是Function.prototype。
下面例子讓我想當(dāng)然的認(rèn)為o.prototype === Function.prototype 應(yīng)該為true的:
function foo() {
this.name = 'foo';
}
Function.prototype.sayHello = function (parent) {
alert('hello');
};
foo.sayHello(); //alert 'hello'
當(dāng)我給Function.prototype增加了一個(gè)sayHello的方法后,foo也從原型身上得到了sayHello。用調(diào)試器觀察了一下,查了一下資料(包括ECMA-262 http://dmitrysoshnikov.com/ecmascript/chapter-5-functions/ 以及 《JavaScript the good parts》第五章5.1 Pseudoclassical) ,發(fā)現(xiàn)foo.prototype的定義如下:
this.prototype = {constructor: this}; //這里是foo.prototype = {constructor: foo};
順便做了以下測試
alert(foo === foo.prototype.constructor); //true
那foo.prototype到底是什么?這跟new關(guān)鍵字有密切的關(guān)系。說一下new foo()干了些什么就知道了。
var obj = {}; //定義一個(gè)新的Object
obj.[[prototype]] == this.prototype;
//注意1:此處的this為foo,foo.prototype此時(shí)有用武之地了,給obj的原型賦值,在此用[[prototype]]表示其原型
//注意2:obj是沒有prototype屬性的,估計(jì)是沒用吧
var other = this.apply(obj, arguments); //這部讓obj.name = 'foo',即obj作為this跑了一遍foo函數(shù)
return (typeof other === 'object' && other) || that; //如果foo函數(shù)返回了一個(gè)對象,則返回該對象,否則返回obj。
這樣就很清楚了,new foo()的時(shí)候,foo創(chuàng)建了一個(gè)對象,并作為其構(gòu)造函數(shù),而foo.prototype則作為新對象的原型來使用。
foo.prototype可以添加任意方法,或改為任意的對象,而不怕修改了Function.prototype(Function.prototype是所有函數(shù)的原型);
this.prototype = {constructor: this};的意義就在于,在沒有手動(dòng)指定foo.prototype的情況下,js指定了一個(gè)默認(rèn)的原型給new出來的新對象。
復(fù)制代碼 代碼如下:
function foo {
this.name = 'foo';
}
alert(foo.prototype === Function.prototype ); //false。 當(dāng)時(shí)一直沒想明白為啥foo的原型不是Function.prototype。
下面例子讓我想當(dāng)然的認(rèn)為o.prototype === Function.prototype 應(yīng)該為true的:
復(fù)制代碼 代碼如下:
function foo() {
this.name = 'foo';
}
Function.prototype.sayHello = function (parent) {
alert('hello');
};
foo.sayHello(); //alert 'hello'
當(dāng)我給Function.prototype增加了一個(gè)sayHello的方法后,foo也從原型身上得到了sayHello。用調(diào)試器觀察了一下,查了一下資料(包括ECMA-262 http://dmitrysoshnikov.com/ecmascript/chapter-5-functions/ 以及 《JavaScript the good parts》第五章5.1 Pseudoclassical) ,發(fā)現(xiàn)foo.prototype的定義如下:
this.prototype = {constructor: this}; //這里是foo.prototype = {constructor: foo};
順便做了以下測試
alert(foo === foo.prototype.constructor); //true
那foo.prototype到底是什么?這跟new關(guān)鍵字有密切的關(guān)系。說一下new foo()干了些什么就知道了。
var obj = {}; //定義一個(gè)新的Object
obj.[[prototype]] == this.prototype;
//注意1:此處的this為foo,foo.prototype此時(shí)有用武之地了,給obj的原型賦值,在此用[[prototype]]表示其原型
//注意2:obj是沒有prototype屬性的,估計(jì)是沒用吧
var other = this.apply(obj, arguments); //這部讓obj.name = 'foo',即obj作為this跑了一遍foo函數(shù)
return (typeof other === 'object' && other) || that; //如果foo函數(shù)返回了一個(gè)對象,則返回該對象,否則返回obj。
這樣就很清楚了,new foo()的時(shí)候,foo創(chuàng)建了一個(gè)對象,并作為其構(gòu)造函數(shù),而foo.prototype則作為新對象的原型來使用。
foo.prototype可以添加任意方法,或改為任意的對象,而不怕修改了Function.prototype(Function.prototype是所有函數(shù)的原型);
this.prototype = {constructor: this};的意義就在于,在沒有手動(dòng)指定foo.prototype的情況下,js指定了一個(gè)默認(rèn)的原型給new出來的新對象。
相關(guān)文章
微信小程序返回上一頁刷新組件數(shù)據(jù)的示例代碼
這篇文章主要介紹了微信小程序返回上一頁刷新組件數(shù)據(jù)的相關(guān)資料,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2024-03-03JS時(shí)間控制實(shí)現(xiàn)動(dòng)態(tài)效果的實(shí)例講解
下面小編就為大家?guī)硪黄狫S時(shí)間控制實(shí)現(xiàn)動(dòng)態(tài)效果的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07JavaScript動(dòng)態(tài)創(chuàng)建form表單并提交的實(shí)現(xiàn)方法
這篇文章主要介紹了JavaScript動(dòng)態(tài)創(chuàng)建form表單并提交的實(shí)現(xiàn)方法,涉及JavaScript動(dòng)態(tài)創(chuàng)建頁面元素及模擬表單提交的技巧,需要的朋友可以參考下2015-12-12利用JS輕松實(shí)現(xiàn)獲取表單數(shù)據(jù)
本文主要介紹了利用JS輕松實(shí)現(xiàn)獲取表單數(shù)據(jù)。方法有別于原始的做法,大家可以試著找原始做法與本文所說方法之間的區(qū)別。有興趣的朋友可以看下,希望對大家有所幫助2016-12-12