javascript中的構造函數、對象、類的難點

構造函數 & 函數 & 方法

三者本是一樣的

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中的構造函數、對象、類的難點


分享到:


相關文章: