建構函式使用

2022-09-13 16:45:10 字數 2999 閱讀 7481

建構函式具有兩個特點,

第一首字母大寫,

第二內部使用this關鍵字,呼叫時必須通過new命令呼叫生成例項。

new的作用

呼叫建構函式生成乙個例項物件,有點類似於工廠模式,每個例項擁有建構函式的方法與屬性。

使用new時可以不加"()",

new foo;

不過閱讀方便這裡推薦加上,建構函式可以接受引數,與普通函式一樣。

function

foo(name)

var a = new

foo();

var a = new foo;

new 呼叫建構函式生成例項步驟分為四步

生成乙個物件,代表要返回的例項物件;

將生成物件的原型指向構建函式的prototype;

將內部this指向生成的物件;

執行函式內部的**。

如果忘記加上new命令會怎麼樣呢?

function

foo()

foo();

//undefined

name; //

10;

因為foo()未指定函式返回值,這裡預設為返回undefined,

this在全域性環境下呼叫預設為全域性物件,這裡是瀏覽器環境this指向window,生成了乙個window.name並賦值為10。

如何避免呼叫忘記不加new方法呼叫?

在函式內部使用嚴格模式,嚴格模式下,this的預設指向為undefined,為undefined新增屬性會報錯。

function

foo()

foo();

//annot set property 'name' of undefined

在函式體內通過判斷

function

foo(name)

this.name =name;

}var a = foo(123);

在全域性下this指向全域性物件,而使用newthis指向例項物件,

通過instanceof來判斷建構函式的原型鏈上是否存在例項物件。

通過new.target屬性判斷

如果是使用new呼叫建構函式,那麼newtarget屬性指向建構函式,否則返回undefined。

function

foo(name)

this.name =name;

}var a = foo(123);

建構函式也可以自己指定返回值, 但是返回值必須是乙個物件,如果不是則忽略返回值,返回this物件,通過指定返回值返回的物件,內部this執行的語句會被忽略。

function

foo(name ,age)

var a = new foo('zhangsan' ,18);

//foo 

function

foo(name ,age) ;

}var a = new foo('zhangsan' ,18);

//

可以看到上面兩個例子有乙個共同點,總是返回乙個物件,

但是如果使用new命令,而函式內部沒有this會怎麼樣呢?

function

foo()

var a = new

foo();

console.log(a);

//foo{}

這裡返回乙個空物件,原型指向建構函式foo.prototype,之所以這樣是因為this指向例項物件a,在foo內部並沒有this,所以就是乙個空物件。

構建函式的缺點

比如下面和這個例子,

假設乙個建構函式內部age是輸出乙個特定的值,在

多個例項中重複出現,這樣的話不僅浪費記憶體,而且因為例項物件不同,每個age方法的記憶體位址也不同,修改age的方法不能做到全部例項更新。

function

foo(name , value)

}var a = new foo('yang' ,20);

var b = new foo('liu' ,11);

console.log(a.age === b.age);//

false

每個函式都有乙個prototype(原型)屬性,對於建構函式來說,例項物件的原型就指向他。

我們可以在建構函式的prototype物件上定義一些共有的方法或者屬性,來實現例項物件共享屬性或者方法。

function

foo(name , value) ;

foo.prototype.age = function

() ;

var a = new foo('yang' ,20);

var b = new foo('liu' ,11);

console.log(a.age === b.age);//

true

因為原型鏈查詢規則,我們也可以在例項自身上定製跟建構函式相同的方法或者屬性。

function

foo(name)

foo.prototype.color = 'yellow';

var a = new foo('yang');

var b = new foo('liu');

console.log(a.color ,b.color);

//yellow yellow

a.color = 'bolor';

console.log(a.color ,b.color);

//bolor yellow

foo.prototype.color = 'a';

console.log(a.color ,b.color);

//bolor a

這樣就做到了自身和建構函式不同行為。

建構函式的使用

在c 中,我們一般會利用建構函式來初始化類裡面的成員函式,先看下面一段 可以自己先考慮輸出語句會不會是0?include using namespace std struct cls cls int main cls obj cout 在 第10行,不帶引數的建構函式直接呼叫了帶引數的建構函式。這種...

建構函式的使用

個人理解的建構函式的使用 function person name,height var person person xiaoli 180 var person1 person xiaohei 170 列印出來的結果是 person object person1 object 個人理解 functi...

何時使用建構函式,建構函式使用new關鍵字

關於何時使用js的建構函式 一般建立多個有相同屬性 方法的物件,就會去寫建構函式,就會去new 如果只是乙個單獨的物件,直接使用字面量就行了 var person js建構函式建立物件加new問題 new操作符做了些什麼呢 1 建立乙個新物件 2 將建構函式的作用域賦給新物件 因此 this 就指向...