我們都知道,使用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 ...