沒有物件?new乙個!

2021-09-13 17:09:14 字數 1637 閱讀 8626

我們都知道,使用new後可返回乙個物件,通常用於例項化乙個「類」。

用法:

function student (name, age) 

student.prototype.sayname = function()

const person =new student('小明');

person.sayname(); // i am 小明

首先我們分析一下,手動實現new需要什麼。

建立乙個函式,可返回乙個新的物件

需要訪問到student建構函式裡的屬性

需要訪問到student.prototype中的屬性和方法

若要實現上面**的相同效果,首先明確需要乙個「類」的引數,以及其它引數(如name)。

js 的函式引數非常靈活,形參數量可不確定(使用...args),也可不給出。函式中有乙個 與生俱來的arguments物件,具有length屬性,但不是陣列,所以不可使用陣列方法。

下述**中的輸出語句結果即為所傳實參的集合:

function objectfactory() 

const person = objectfactory(student, '小明',18);

由前面arguments簡單分析可知,arguments中的第乙個引數即為student的建構函式。上面說到,arguments 並非陣列,那我們如何得到第一項呢?

兩種方法:.shift.call(arguments)array.from(arguments)

var constructor = .shift.call(arguments);
建立乙個新的物件非常簡單,如下:

const obj = new object();
__proto__是物件的私有屬性,指向構造該物件的建構函式的原型。所以此步須將新的物件的此屬性指向constructor的原型。

obj.__proto__ = constructor.prototype;
若要例項化乙個「類」,則必須呼叫其建構函式,在執行建構函式時,其this的值是動態的變化的,即為當前呼叫該函式的物件。

可是這裡有個問題,若此時直接呼叫建構函式並傳值

constructor(arguments);
最終結果將為undefined

這是為什麼呢?

結果:

function objectfactory()

const person = objectfactory(student, '小明', 18);

person.sayname(); // i am 小明

物件 new乙個

1格式格式 class 類名 類名 要求符合大駝峰命名法,見名知意 類名這裡可以認為是乙個資料型別名,自定義資料型別 屬性描述 描述當前類有哪些屬性 例如 人類的身高體重,年齡姓名 行為描述 描述當前類有哪些行為 例如 人類的吃飯行為,睡覺行為,打遊戲行為依葫蘆畫瓢格式 scanner掃瞄器 sca...

new乙個物件的過程

class a public void a string name,int age class b 執行順序 1 因為new用到了 a.class,所以會先找到a.class檔案並載入到記憶體中 2 執行該類中的static 塊,如果有的話,給a.class類進行初始化。3 在堆記憶體中開闢空間,分...

new乙個物件的過程

1.靜態 塊 2.預設初始化 3.構造 塊 4.構造方法 靜態 塊先執行,構造 塊執行,物件內執行 class person static public class persondemo2 執行結果 列印 靜態 塊1 構造 塊2 建構函式3 class a public void a string ...