js高階-建立一個物件的過程
阿新 • • 發佈:2021-12-31
建立物件方法有兩種,物件字面量/建構函式
(1)物件字面量
它適合少量簡單的物件建立
var obj = { a:10, b:'符', say(){ //函式體 } } //但是如果我們需要建立大量具有相同型別屬性和方法(但值不同)的物件時,物件字面量就不適合了
//而且它也沒有繼承這類高階特性
//比如你需要建立統計公司1w名員工資訊,總不可能一個一個去寫物件字面量吧
物件字面量在建立大量同類型物件上的不足,建構函式解決了這個問題
(2)建構函式
建構函式通過new操作符呼叫建構函式,建立對應型別物件
建構函式的定義
function Fn(){ this.p = "建立了一個p屬性"; this.alterP = function(){ console.log(this.p); //注意一定要this,執行呼叫它的物件,才能用作用域鏈找到p } } var o1 = new Fn();
在new呼叫建構函式時,發生的過程實際上為
// 創造一個空物件字面量 var obj = {}; // 給空物件新增__proto__屬性,並將建構函式的原型物件引用地址賦值給它 obj.__proto__ = Fn.prototype; // 將建構函式的作用域賦值個新物件,Fn函式中的this在call()函式操作下指向新物件obj,然後再呼叫Fn函式於是給obj物件賦值了一個成員變數p和成員方法alterP Fn.call(obj); //最後將這個obj物件作為new操作Fn返回的結果賦值給a變數 return obj; var a = obj
(3)constructor屬性
修改物件原型上的constructor屬性指向另一個建構函式,再呼叫原建構函式也不會發生變化,,起初始化物件作用的只能是建構函式本身
function C3(a, b){ this.p = a + b; this.alertP = function(){ alert(this.p); } }//我們定義一個函式來覆蓋C3原型中的constructor,試圖改變屬性p的值 function fake(){ this.p = 100; } C3.prototype.constructor = fake; //覆蓋C3原型中的constructor var c3 = new C3(2,3); c3.alertP();//結果仍然為5