構造函數 & 函數 & 方法
三者本是一樣的
function fn(a,b){
...
}
fn是個函數,當你new它時認為它是個構造函數,當函數放在對象裡時就成為方法。
看一個構造函數的例子:
function fn(a,b){
this.a=a;
this.b=b;
}
var myfn=new fn(1,2);
myfn;
//{a:1,b:2}
對象
以上面的 myfn 為例,對象可以直接寫出來也可以通過new構造函數創建出來,一個對象除了鍵值對以外,還有原型對象( _proto_ )這個屬性
類
js無類這個概念,但是有繼承,他是通過構造函數的原型對象( prototype )來實現的,也就是說js中的類可以理解為構造函數:
首字母大寫的構造函數。
//這相當於一個類
function Fn(a,b){
this.a=a;
this.b=b;
}
Fn.prototype.getvalue=function(){
console.log(this.a);
console.log(this.b);
}
類實例化(new)的過程
var myfn=new Fn(1,2);
1. 創建一個空對象 {}
{};
2. 將新對象的 _proto_ 屬性指向構造函數的 prototype
{}._proto_=fn.prototype;
3. 在新對象中執行構造函數
這個過程中的this始終指向新對象,獲取 a 和 b 屬性
{a:1,b:2}
4. 將新對象(指針)放在變量中
var myfn = {a:1,b:2};
注:所以說實例的屬性方法一部分來自構造函數執行的過程,一部分來自 prototype 對象
prototype 和 _proto_
它們都是原型對象,prototype 稱為顯示原型,_proto_ 為隱身原型。
區別
原型對象在構造函數中為 prototype,在對象中為 _proto_ (當同一個構造函數實例化多次時,這些實例的 _proto_ 是同一個)
constructor
對象的構造器指的就是創建它的構造函數(指針)。
構造函數prototype.constructor指向構造函數本身。
注意:使用繼承時,經常給 prototype 賦值,此操作改變了prototype.constructor,必須將構造函數糾正
function Fn(){
}
Fn.prototype.getvalue=function(){
console.log(123);
}
//繼承
function Subfn(){
}
Subfn.prototype=new Fn();
Subfn.prototype.constructor=Subfn;//糾正
文章到這裡結束,限於篇幅,有什麼迷惑的地方,歡迎留言
【關注一下不迷路~】
閱讀更多 全棧前端 的文章
關鍵字: 編程語言 JavaScript 技術